Skip to content

Conversation

@vladstepanyuk
Copy link
Collaborator

@vladstepanyuk vladstepanyuk commented Oct 2, 2025

@vladstepanyuk vladstepanyuk added large-tests Launch large tests for PR blockstore Add this label to run only cloud/blockstore build and tests on PR labels Oct 2, 2025
@github-actions
Copy link
Contributor

github-actions bot commented Oct 3, 2025

Note

This is an automated comment that will be appended during run.

🔴 linux-x86_64-relwithdebinfo: some tests FAILED for commit eec2a6b.

TESTS PASSED ERRORS FAILED FAILED BUILD SKIPPED MUTED?
5795 5793 0 0 1 1 0

🔴 linux-x86_64-relwithdebinfo: some tests FAILED for commit eec2a6b.

TESTS PASSED ERRORS FAILED FAILED BUILD SKIPPED MUTED?
5795 5792 0 1 1 1 0

🟢 linux-x86_64-relwithdebinfo: all tests PASSED for commit eec2a6b.

TESTS PASSED ERRORS FAILED FAILED BUILD SKIPPED MUTED?
2 2 0 0 0 0 0

@github-actions
Copy link
Contributor

github-actions bot commented Oct 6, 2025

Note

This is an automated comment that will be appended during run.

🔴 linux-x86_64-relwithdebinfo: some tests FAILED for commit cb70f2b.

TESTS PASSED ERRORS FAILED FAILED BUILD SKIPPED MUTED?
5842 5839 0 2 0 1 0

🟢 linux-x86_64-relwithdebinfo: all tests PASSED for commit cb70f2b.

TESTS PASSED ERRORS FAILED FAILED BUILD SKIPPED MUTED?
4 4 0 0 0 0 0

}

if (AgentsWithAttachDetachRequestsInProgress.size() ==
Config->GetMaxInflightAttachDetachPathRequestsProcessing())
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А зачем этот ограничитель? Чего боимся?

Copy link
Collaborator Author

@vladstepanyuk vladstepanyuk Oct 7, 2025

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;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А реально, зачем поколение таблетки? От чего страхуемся?
Гарантий от локальной базы должно хватать чтобы этого не требовалось

Copy link
Collaborator Author

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

Copy link
Collaborator

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 выполнять не надо.

Copy link
Collaborator Author

@vladstepanyuk vladstepanyuk Oct 22, 2025

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

@github-actions
Copy link
Contributor

github-actions bot commented Oct 7, 2025

Note

This is an automated comment that will be appended during run.

🔴 linux-x86_64-relwithdebinfo: some tests FAILED for commit 93a9dfa.

TESTS PASSED ERRORS FAILED FAILED BUILD SKIPPED MUTED?
5842 5839 0 2 0 1 0

🟢 linux-x86_64-relwithdebinfo: all tests PASSED for commit 93a9dfa.

TESTS PASSED ERRORS FAILED FAILED BUILD SKIPPED MUTED?
4 4 0 0 0 0 0

@vladstepanyuk vladstepanyuk force-pushed the users/vladstepanyuk/issue-4293/1 branch from 93a9dfa to c9d19c6 Compare October 14, 2025 08:06
@github-actions
Copy link
Contributor

Note

This is an automated comment that will be appended during run.

🟢 linux-x86_64-relwithdebinfo: all tests PASSED for commit c9d19c6.

TESTS PASSED ERRORS FAILED FAILED BUILD SKIPPED MUTED?
5867 5866 0 0 0 1 0

// // // //
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// // // //
// PATH_ATTACH_STATE_ATTACHING // No // active attach //
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Зачем нужны attaching/detaching состояния? Инфру держать, пока DA отвечает?

Copy link
Collaborator Author

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 - чтобы держать инфру пока девайс не закроется

Copy link
Collaborator

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, не смотря на статус девайса, прокручивает фарш полностью.

Copy link
Collaborator Author

@vladstepanyuk vladstepanyuk Oct 22, 2025

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.

@vladstepanyuk vladstepanyuk force-pushed the users/vladstepanyuk/issue-4293/1 branch from c9d19c6 to d947de9 Compare October 20, 2025 08:52
@github-actions
Copy link
Contributor

Note

This is an automated comment that will be appended during run.

🟢 linux-x86_64-relwithdebinfo: all tests PASSED for commit d947de9.

TESTS PASSED ERRORS FAILED FAILED BUILD SKIPPED MUTED?
5867 5866 0 0 0 1 0

repeated TPathToGeneration PathsToDetach = 2;

// Generation of DR tablet.
uint32 DiskRegistryGeneration = 3;
Copy link
Collaborator

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 //
Copy link
Collaborator

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;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Разве одного списка DetachedPaths не хватит? Если путь в этом списке, то он отцепплен, иначе - прицеплен.

Comment on lines +650 to +654
// Allowed devices attached to the agent.
repeated TPathToGeneration AllowedPaths = 4;

// Unallowed devices attached to the agent.
repeated TPathToGeneration UnknownPaths = 5;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Зачем TPathToGeneration, а не просто string?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

потому что все операции присоединения отсоединения у меня должны быть гарантировано упорядочены, чтобы девайс ни закрывался ни открывался если уже пришел более свежий запрос

хочется быть максимально увереным что никаких гонок не будет, потому что если вдруг аллоцируется диск на закрытом девайсе то это залипание пока не придет дежурный и не рестартанет DA

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

blockstore Add this label to run only cloud/blockstore build and tests on PR large-tests Launch large tests for PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants