Skip to content
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

retry with new checkpoint if shadow disk failed #3004

Draft
wants to merge 6 commits into
base: main
Choose a base branch
from

Conversation

gy2411
Copy link
Collaborator

@gy2411 gy2411 commented Feb 10, 2025

#1950

Сейчас есть баг при создании снапшотов из disk registy based дисков. Чекпоинты для таких дисков делаются через теневой диск (shadow disk). Сейчас, если вот тут мы от чекпоинта с теневым диском получаем статус Error, то мы удаляем чекпоинт и ретраим таск. При ретрае таск падает при попытке создать чекпоинт с тем же id, что был у удалённого чекпоинта.

Теперь вместо этого мы при ретрае создаём чекпоинт с новым checkpoint id.

Важно! Эта правка ещё не полностью решает проблему с падением теневого диска. Она не покрывает случай, когда теневой диск успешно налился, но упал походу наливки снапшота в рамках dataplane таска.

@gy2411 gy2411 force-pushed the users/gayurgin/retry_with_new_checkpoint_id_shadow_disk_failed branch from 120c4ed to 0d4a593 Compare February 11, 2025 15:44
Copy link
Contributor

Note

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

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

TESTS PASSED ERRORS FAILED SKIPPED MUTED?
6352 6347 0 4 0 1

@@ -94,6 +94,12 @@ func (t *createImageFromDiskTask) run(
}

err = nbsClient.EnsureCheckpointReady(ctx, disk.DiskId, checkpointID)
if errors.Is(err, errors.NewEmptyRetriableError()) {
Copy link
Collaborator Author

@gy2411 gy2411 Feb 11, 2025

Choose a reason for hiding this comment

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

Такая провека ошибки выгдялит не очень здорово. Возможно, стоит из метода EnsureCheckpointReady возвращать статус чекпоинта, а не ошибку? Но в таком случае не понятно, зачем нужен метод EnsureCheckpointReady.
Хотелось, чтобы этот метод помогал убрать дублирование кода между созданием снапшота и созданием образа -- но получается, что он не особо помогает это сделать...

@gy2411
Copy link
Collaborator Author

gy2411 commented Feb 11, 2025

Отдельный вопрос -- потом аналогичную правку надо будет сделать и для создания образов. И в текущем виде это приведёт к большому дублированию.

Хотелось бы этого избежать. Может, попытаться вынести эту логику в dataplane?

Но не текущем этапе предлагаю добить текушую правку, а уже потом разобраться, как это улучшить.

////////////////////////////////////////////////////////////////////////////////

func (t *createSnapshotFromDiskTask) makeCheckpointID(index int) string {
return fmt.Sprintf("%v_%v", t.request.DstSnapshotId, index)
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Важно: теперь id чекпоинта может не совпадать с id соответствующего снапшота! Насколько я могу судить по коду, мы нигде не закладывались на то, что они совпадают.

@gy2411
Copy link
Collaborator Author

gy2411 commented Feb 11, 2025

@BarkovBG предлагал здесь возвращать публичную ошибку здесь в случае, если датаплейн таск упал из-за падения теневого диска. Т.е. раз уж мы пока не умеем обрабатывать такой случай, то пусть хотя бы будет публичная ошибка, а не внутренняя. Стоит ли так сделать?

if err != nil {
return err
}
if t.state.CheckpointID == "" {
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Мотивировка этого if (и вообще мотивировка поля CheckpointID) -- мы не должны обновлять чекпоинт, если мы уже зашедуллили dataplane таск с предыдущим чекпоинтом.

)
}

func TestSnapshotServiceCreateSnapshotFromDiskWithFailedShadowDiskLong(t *testing.T) {
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

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

Copy link
Contributor

Note

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

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

TESTS PASSED ERRORS FAILED SKIPPED MUTED?
6360 6356 0 4 0 0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant