-
Notifications
You must be signed in to change notification settings - Fork 23
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add lagging agent concept to the volume #2524
base: main
Are you sure you want to change the base?
Conversation
21ff8af
to
852563f
Compare
852563f
to
99e7632
Compare
cfdcc31
to
23b16ca
Compare
@@ -61,6 +61,8 @@ class TNonreplicatedPartitionConfig | |||
const NActors::TActorId ParentActorId; | |||
const bool MuteIOErrors; | |||
const THashSet<TString> FreshDeviceIds; | |||
// List of devices that have outdated data. Can only appear on mirror disks. | |||
const THashSet<TString> LaggingDeviceIds; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Добавил в partition config список девайсов которые отстают.
Будет использоваться для двух вещей: mirror partition не читает из таких из-за DevicesReadyForReading()
и в nonrepl partition тоже будет предохранитель "на всякий случай" от наших сервисных запросов.
@@ -606,9 +618,10 @@ std::unique_ptr<TTestActorRuntime> PrepareTestActorRuntime( | |||
TDiskRegistryStatePtr diskRegistryState, | |||
NProto::TFeaturesConfig featuresConfig, | |||
NRdma::IClientPtr rdmaClient, | |||
TDiskAgentStatePtr diskAgentState) | |||
TVector<TDiskAgentStatePtr> diskAgentStates) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
В тестах волума добавил возможность создавать больше 1 диск агента.
Без этого ничего не протестировать нормально, т.к. логика волума расчитывает на то что разные реплики mirror диска не могут содержать девайсы одного агента.
cloud/blockstore/libs/storage/partition_nonrepl/part_nonrepl_migration_ut.cpp
Outdated
Show resolved
Hide resolved
THashSet<TString>(), // laggingDeviceIds | ||
TDuration::Zero(), // maxTimedOutDeviceStateDuration | ||
false, // maxTimedOutDeviceStateDurationOverridden | ||
true // useSimpleMigrationBandwidthLimiter |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
clang-format
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Он так и сделал
for (const auto& laggingDevice: disk.LaggingDevices) { | ||
*response->Record.AddRemovedLaggingDevices() = laggingDevice; | ||
} | ||
disk.LaggingDevices.clear(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
а почему тут происходит очистка?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Порядок действий с настоящим DR такой:
- Волюм потерял возможность восстановить lagging девайс
- Волюм отправляет все такие девайсы в DR
- DR для каждого решает что сделать. Обычно он их делает фрешами и запускает реалокацию
- В реалокации к волюму приходит список лагающих девайсов которые DR учёл. Волюм удаляет их у себя
- DR удаляет лагающие девайсы у себя на ответ от волюма
В тестах проще сразу чистить.
{ | ||
std::optional<ui32> replicaIndex; | ||
const RepeatedPtrField<NProto::TDeviceConfig>* replicaDevices = nullptr; | ||
const auto deviceMatcher = [agentNodeId](const NProto::TDeviceConfig& device) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
agentMatcher
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Так он же девайсы матчит.
} | ||
|
||
// There is no devices from desired agent. | ||
if (!replicaIndex || !replicaDevices) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
а если агент был только в миграциях, то мы его не добавим.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
В 139 строке цикл по миграциям специально для этого случая.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Я добавлю тест про это.
string DeviceUUID = 1; | ||
|
||
// Index of the lagging device in the replica. | ||
uint32 RowIndex = 2; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
может удобнее тут иметь индекс реплики ?
uint32 ReplicaIndex = 3;
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Я чет не придумал где оно сильно пригодиться может
720e631
to
68ae225
Compare
for (const auto& laggingAgent: | ||
State->GetMeta().GetLaggingAgentsInfo().GetAgents()) | ||
{ | ||
for (const auto& laggingDevice: laggingAgent.GetDevices()) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
а каким механизмом мы будем говорить DR что агент больше не лагает?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Мы не будем.
Лагающие отправляем в DR, а он тут же их назначает fresh'ами и отдаёт нам новый конфиг. Волум чистит лагающие девайсы у себя и DR у себя
laggingAgent.GetAgentId().c_str()); | ||
|
||
STORAGE_CHECK_PRECONDITION( | ||
laggingAgent.GetDevices().size() == |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ресайз лагающего диска не нарушит инвариант?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ресайз это обновление конфига. Мы на него позовём UpdateLaggingDevicesAfterMetaUpdate
и там всё "починится"
timeoutedAgentDevices.ysize()); | ||
NCloud::Send( | ||
ctx, | ||
State->GetDiskRegistryBasedPartitionActor(), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
AddLaggingAgent шлем в партишен, тем самым подтверждаем что мы уже считаем агент лагающим. а почему может получится что мы уже внесли агента в это состояние?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Внутри партишиона будут 2 состояние у лагающего:
- недоступен - когда агент не отвечает
- наливка - когда агент проснулся и мы наливаем отстающие блоки.
Но в процессе наливки он опять может залагать
} | ||
|
||
// Check for fresh devices in the same row. | ||
for (const auto& laggingDevice: timeoutedAgentDevices) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
может в утилитах должна быть какая-то функция, отвечающая на вопрос можно ли сделать девайс лагающим если нет, то формулирующим ошибку?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Не знаю. А в чём мотив? Сделать код волума поменьше или что?
unavailableAgent.MutableDevices()->Assign( | ||
timeoutedAgentDevices.begin(), | ||
timeoutedAgentDevices.end()); | ||
ExecuteTx<TAddLaggingAgent>( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
UpdateVolumeConfigInProgress = true ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Не, эта булка про обновление конфига, например при ресайзе.
|
||
struct TDeviceTimeoutedRequest | ||
{ | ||
const ui32 RowIndex; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
RowIndex не определяется по DeviceUUID ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Можно, но запоминать сильно проще чем искать их каждый раз
Первый большой ПР про issue #3. Здесь я добавляю логику в Volume для работы с отстающими репликами.
Текущий код пока не работает. Поэтому никаких фича тоглов я ещё не добавлял. Они будут в следующих ПРах.
Чтобы машинерия завертелась, volume должен получить сообщение
TEvVolumePrivate::TEvDeviceTimeoutedRequest
от partition. Volume проверяет может ли он сделать агента, которому принадлежит девайс отстающим (lagging). Может в случае если в тех же строках нет других lagging/fresh девайсов.Далее он сохраняет lagging девайсы в базу и отправляет сообщение в mirror partition. Обработка этого сообщения будет в следущих ПРах.
Также в этом ПРе есть новое сообщение в DR -
TEvDiskRegistry::TEvAddLaggingDevicesRequest
. Если partition был перезапущен, то вся информация в оперативной памяти о dirty блоках была потеряна. Поэтому нужно уведомить DR о том, что волум имеет lagging девайсы, дабы случайно не получилось минус 3 реплики.Его логика тоже будет в следующих ПРах.
Дока по фиче здесь: https://github.com/ydb-platform/nbs/blob/main/doc/blockstore/storage/dynamic_io_mirroring_proposal.md