-
Notifications
You must be signed in to change notification settings - Fork 22
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
issue-652: do not acquire barriers from the past upon FlushBytes
#1919
Conversation
FlushBytes
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.
Хотя нет, unship, теперь у нас FlushBytes начинает отличаться от Compaction. Compaction генерирует CommitId один раз и использует его как для своих DstBlobs, так и для установки барьера. Не хочется, чтобы FlushBytes отличался от Compaction в этом месте, т.к. по своей сути он делает то же самое, что и Compaction.
Также смущает следующее. Compaction и FlushBytes читают индекс на Prepare-стадии. А CollectBarrier устанавливают на Complete-стадии. Между этими стадиями могут случиться другие события. Сейчас код устроен так, что Cleanup / Compaction / FlushBytes не работают одновременно. При этом что-то поменять в индексе так, что в определенном диапазоне по определенному CommitId могут перестать находиться блобы, которые на Prepare-стадии нашел Compaction или FlushBytes, могут только операции Cleanup / Compaction / FlushBytes. Но это, во-первых, хрупко и заслуживает как минимум комментария в коде. Во-вторых, когда мы начнем реализовывать #1923 , такой операцией также станет DeleteCheckpoint, и надо написать в коде //TODO(#1923)
про вот эту ситуацию. Ну и подумать еще раз, а не может ли уже прямо сейчас быть проблемой тот факт, что блобы ищутся в индексе на Prepare-стадии, а барьер ставится позже - на Complete.
cloud/filestore/libs/storage/tablet/tablet_actor_flush_bytes.cpp
Outdated
Show resolved
Hide resolved
cloud/filestore/libs/storage/tablet/tablet_actor_flush_bytes.cpp
Outdated
Show resolved
Hide resolved
…1919) issue-652: add test reproducing the error
References (and, hopefully, fixes) #652
The main problem is that FlushBytes acquires collect barrier, which is less than the last collect commit id:
This will lead to the following file layout:
[ccccccc][bbbbbbb][f]
After execution of the Cleanup operation, the first blob will be marked as garbage
Let us execute FlushBytes operation, It will acquire collect barrier, equal to the minimal commitId, associated with FreshBlobs:
nbs/cloud/filestore/libs/storage/tablet/tablet_actor_flush_bytes.cpp
Lines 669 to 671 in 836a516
After this acquisition there will be one barrier, equal to 43:
nbs/cloud/filestore/libs/storage/tablet/model/garbage_queue.cpp
Lines 227 to 228 in 836a516
After it the CollectGarbage request with one new grabage will be sent, leading to a decrease in collectCommitIds sequence: 42 after 44