-
Couldn't load subscription status.
- Fork 37
Issue-4293: added to Disk Registry, sending attach/detach requests for CMS events (ADD_DEVICE/ADD_HOST/REMOVE_DEVICE/REMOVE HOST) #4442
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
base: main
Are you sure you want to change the base?
Conversation
|
Note This is an automated comment that will be appended during run. 🔴 linux-x86_64-relwithdebinfo: some tests FAILED for commit eec2a6b.
🔴 linux-x86_64-relwithdebinfo: some tests FAILED for commit eec2a6b.
🟢 linux-x86_64-relwithdebinfo: all tests PASSED for commit eec2a6b.
|
|
Note This is an automated comment that will be appended during run. 🔴 linux-x86_64-relwithdebinfo: some tests FAILED for commit cb70f2b.
🟢 linux-x86_64-relwithdebinfo: all tests PASSED for commit cb70f2b.
|
cloud/blockstore/libs/storage/disk_registry/disk_registry_actor_attach_detach_path.cpp
Outdated
Show resolved
Hide resolved
cloud/blockstore/libs/storage/disk_registry/disk_registry_actor_attach_detach_path.cpp
Show resolved
Hide resolved
cloud/blockstore/libs/storage/disk_registry/disk_registry_actor_attach_detach_path.cpp
Outdated
Show resolved
Hide resolved
| } | ||
|
|
||
| if (AgentsWithAttachDetachRequestsInProgress.size() == | ||
| Config->GetMaxInflightAttachDetachPathRequestsProcessing()) |
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.
да просто на всякий случай, как будто лучше всегда ограничивать максимальную паралельность, чтобы например в случае чего на всем кластере cразу одновременно не начинать тяжелые операции открытия девайсов
| repeated TPathToGeneration PathsToDetach = 2; | ||
|
|
||
| // Generation of DR tablet. | ||
| uint32 DiskRegistryGeneration = 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.
А реально, зачем поколение таблетки? От чего страхуемся?
Гарантий от локальной базы должно хватать чтобы этого не требовалось
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 в поколении n-1 отправляет реквест с закрытием девайса
DR рестартует
DR с поколением n отправляет реквест с открытием девайса
DA получает сообщение от DR с поколением n реквест на открытие девайса
DA получет сообщение от DR с поколением n-1 реквест на закрытие девайса
DR думает что девайс открыт но девайс закрыт, локальная база же никак не гарантирует порядок сообщений к DA
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.
Если к каждому запросу прицеплен seqNo, то DA поймет, что если он уже выполнил запрос с seqNo=n, запрос с SeqNo=n-1 выполнять не надо.
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.
так я этот seqNo в оперативке храню, если Dr рестартанет, то и seqNo сбросится
можно конечно их в локальной базе хранить, но как мне кажется хранить эти seqNo в базе будет более геморно чем отправлять два счетчика - поколение таблетки и хранимый в оперативе seqNo
cloud/blockstore/libs/storage/disk_registry/disk_registry_actor_attach_detach_path.cpp
Outdated
Show resolved
Hide resolved
cloud/blockstore/libs/storage/disk_registry/disk_registry_state.cpp
Outdated
Show resolved
Hide resolved
|
Note This is an automated comment that will be appended during run. 🔴 linux-x86_64-relwithdebinfo: some tests FAILED for commit 93a9dfa.
🟢 linux-x86_64-relwithdebinfo: all tests PASSED for commit 93a9dfa.
|
93a9dfa to
c9d19c6
Compare
| // // // // | ||
| /////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
| // // // // | ||
| // PATH_ATTACH_STATE_ATTACHING // No // active attach // |
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.
Зачем нужны attaching/detaching состояния? Инфру держать, пока DA отвечает?
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.
attaching - чтобы случайно не алоцировать диск на закрытом девайсе (как только мы поймем что девайс открыт мы переведем его в состояние PATH_ATTACH_STATE_ATTACHED), ну и чтобы не долбится с секьюр эрейзами в него пока мы его не откроем
detaching - чтобы держать инфру пока девайс не закроется
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.
attaching - чтобы случайно не алоцировать диск на закрытом девайсе (как только мы поймем что девайс открыт мы переведем его в состояние PATH_ATTACH_STATE_ATTACHED), ну и чтобы не долбится с секьюр эрейзами в него пока мы его не откроем
А если помечать девайсы приаттаченными только после ответа DA?
Инфра приходит в DR, DR идет в DA; DA прицепляет девайс, отвечает в DR; DR помечает девайс прицепленным, отвечает в инфру.
Если DR перезапустился, инфра ретраит запрос.
detaching - чтобы держать инфру пока девайс не закроется
Инфра пришла с запросом Detach; DR помечает девайс отцепленным (в базе), отправляет запрос в DA; DA отцепляет девайс и отвечает в DR; DR отвечает в инфру.
Если DR перезапускается в середине; Инфра ретраит запрос, 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.
А если помечать девайсы приаттаченными только после ответа DA?
Инфра приходит в DR, DR идет в DA; DA прицепляет девайс, отвечает в DR; DR помечает девайс прицепленным, отвечает в инфру.
Если DR перезапустился, инфра ретраит запрос.
Тогда надо будет распиливать как-то транзакции AddDevice/AddHost. Типа сначала проверить, что добавление этого девайса вообще возможно (запустить dry run транзакции), затем выполнить присоединение девайса и потом полноценную транзакцию AddDevice/AddHost.
Ну и тогда получается, что на присоединении у нас будет сначала запрос в DA, затем пишущая транзакция, а на отсоединении наоборот. Лично мне кажется, это может запутать потом, и лучше сделать одинаковым образом и на присоединении, и на отсоединении.
Плюс надо будет где-то (видимо, в каком-то акторе или внутри ДР-актора) прикапывать RequestInfo для ответа инфре, т. е. список Pending CMS запросов.
Плюс, если вдруг что-то посередине этой цепочки произойдет, то запросы ретраятся. А если вдруг ретраить не будут, то система окажется в каком-то странном состоянии, что вроде в DA девайс открыт и т. д., но и DR, и инфра думают, что девайс еще не присоединен и не введен, соответственно (например, если ответ от DA потерялся). В реальной жизни такого, конечно, быть не должно, что запросы не ретраятся, но вообще это вроде теоретически валидное поведение, которое при этом приводит систему в странное состояние с нарушенными инвариантами.
Инфра пришла с запросом Detach; DR помечает девайс отцепленным (в базе), отправляет запрос в DA; DA отцепляет девайс и отвечает в DR; DR отвечает в инфру.
Если DR перезапускается в середине; Инфра ретраит запрос, DR, не смотря на статус девайса, прокручивает фарш полностью.
Опять же, чтобы всё нормально работало, инфре снаружи надо постоянно что-то ретраить, иначе риск нарушенных инвариантов между DA и DR по состоянию «прикрепленности» девайсов. Плюс лишние закрытия девайсов, не страшно, но просто зачем, если их можно избежать?
Мне кажется, это выглядит гораздо сложнее и опаснее, чем добавление отдельного состояния, что девайс в процессе присоединения/отсоединения, с выполнением этих операций в асинхронном режиме. Так мы четко видим, какие девайсы полностью введены в использование, а какие только в процессе. Плюс ничего страшного у меня не произойдет, если вдруг запросы перестанут ретраиться, операция сама в асинхронном режиме «доползет» до конца. И оно как-то лучше ложится на существующую логику, не надо как-то распиливать транзакции, отвечающие за операции, или продлевать их исполнение запросами в DA.
…ts, replaced E_ARGUMENT with E_PRECONDITION_FAILED and corrected some other issues
c9d19c6 to
d947de9
Compare
| repeated TPathToGeneration PathsToDetach = 2; | ||
|
|
||
| // Generation of DR tablet. | ||
| uint32 DiskRegistryGeneration = 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.
Если к каждому запросу прицеплен seqNo, то DA поймет, что если он уже выполнил запрос с seqNo=n, запрос с SeqNo=n-1 выполнять не надо.
| // // // // | ||
| /////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
| // // // // | ||
| // PATH_ATTACH_STATE_ATTACHING // No // active attach // |
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.
attaching - чтобы случайно не алоцировать диск на закрытом девайсе (как только мы поймем что девайс открыт мы переведем его в состояние PATH_ATTACH_STATE_ATTACHED), ну и чтобы не долбится с секьюр эрейзами в него пока мы его не откроем
А если помечать девайсы приаттаченными только после ответа DA?
Инфра приходит в DR, DR идет в DA; DA прицепляет девайс, отвечает в DR; DR помечает девайс прицепленным, отвечает в инфру.
Если DR перезапустился, инфра ретраит запрос.
detaching - чтобы держать инфру пока девайс не закроется
Инфра пришла с запросом Detach; DR помечает девайс отцепленным (в базе), отправляет запрос в DA; DA отцепляет девайс и отвечает в DR; DR отвечает в инфру.
Если DR перезапускается в середине; Инфра ретраит запрос, DR, не смотря на статус девайса, прокручивает фарш полностью.
| bool TemporaryAgent = 13; | ||
|
|
||
| // Attach state for each path. | ||
| map<string, EPathAttachState> PathAttachStates = 14; |
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.
Разве одного списка DetachedPaths не хватит? Если путь в этом списке, то он отцепплен, иначе - прицеплен.
| // Allowed devices attached to the agent. | ||
| repeated TPathToGeneration AllowedPaths = 4; | ||
|
|
||
| // Unallowed devices attached to the agent. | ||
| repeated TPathToGeneration UnknownPaths = 5; |
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.
Зачем TPathToGeneration, а не просто string?
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.
потому что все операции присоединения отсоединения у меня должны быть гарантировано упорядочены, чтобы девайс ни закрывался ни открывался если уже пришел более свежий запрос
хочется быть максимально увереным что никаких гонок не будет, потому что если вдруг аллоцируется диск на закрытом девайсе то это залипание пока не придет дежурный и не рестартанет DA
#4293
Описание логики тут https://github.com/ydb-platform/nbs/blob/main/doc/blockstore/disk_registry/attach-detach-hw-devices-in-da-on-cms.md