-
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
Первый большой ПР про 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