Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
scrubber: add separate find/purge garbage commands (#5409)
## Problem The previous garbage cleanup functionality relied on doing a dry run, inspecting logs, and then doing a deletion. This isn't ideal, because what one actually deletes might not be the same as what one saw in the dry run. It's also risky UX to rely on presence/absence of one CLI flag to control deletion: ideally the deletion command should be totally separate from the one that scans the bucket. Related: #5037 ## Summary of changes This is a major re-work of the code, which results in a net decrease in line count of about 600. The old code for removing garbage was build around the idea of doing discovery and purging together: a "delete_batch_producer" sent batches into a deleter. The new code writes out both procedures separately, in functions that use the async streams introduced in #5176 to achieve fast concurrent access to S3 while retaining the readability of a single function. - Add `find-garbage`, which writes out a JSON file of tenants/timelines to purge - Add `purge-garbage` which consumes the garbage JSON file, applies some extra validations, and does deletions. - The purge command will refuse to execute if the garbage file indicates that only garbage was found: this guards against classes of bugs where the scrubber might incorrectly deem everything garbage. - The purge command defaults to only deleting tenants that were found in "deleted" state in the control plane. This guards against the risk that using the wrong console API endpoint could cause all tenants to appear to be missing. Outstanding work for a future PR: - Make whatever changes are needed to adapt to the Console/Control Plane separation. - Make purge even safer by checking S3 `Modified` times for index_part.json files (not doing this here, because it will depend on the generation-aware changes for finding index_part.json files) ## Checklist before requesting a review - [ ] I have performed a self-review of my code. - [ ] If it is a core feature, I have added thorough tests. - [ ] Do we need to implement analytics? if so did you add the relevant metrics to the dashboard? - [ ] If this PR requires public announcement, mark it with /release-notes label and add several sentences in this section. ## Checklist before merging - [ ] Do not forget to reformat commit message to not include the above checklist --------- Co-authored-by: Arpad Müller <arpad-m@users.noreply.github.com> Co-authored-by: Shany Pozin <shany@neon.tech>
- Loading branch information
1 parent
39b148b
commit 7c16b52
Showing
12 changed files
with
727 additions
and
1,433 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
7c16b52
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.
2409 tests run: 2199 passed, 88 failed, 122 skipped (full report)
Failures on Postgres 16
test_ondemand_download_timetravel[real_s3]
: debugtest_ondemand_download_large_rel[real_s3]
: debugtest_pageserver_restart[False]
: debugtest_remote_storage_backup_and_restore[False-real_s3]
: debugtest_tenant_delete_smoke[real_s3]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-tenant-delete-before-background-False]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-tenant-delete-before-remove-timelines-dir-False]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-tenant-delete-before-create-local-mark-False]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-tenant-delete-before-polling-ongoing-deletions-False]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-before-rm-False]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-tenant-delete-before-create-remote-mark-False]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-tenant-delete-before-remove-timelines-dir-False]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-tenant-delete-before-remove-deleted-mark-False]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-after-rm-dir-False]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-before-index-deleted-at-False]
: debugtest_detach_while_attaching[real_s3]
: debugtest_emergency_relocate_with_branches_createdb[real_s3]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-before-index-deleted-at]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-before-rm]
: release, debugtest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-during-rm]
: release, debugtest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-after-rm-metadata]
: release, debugtest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-after-rm-dir]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-before-rm]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-after-rm]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-after-rm]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-during-rm]
: releasetest_timeline_delete_resumed_on_attach[real_s3]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-after-index-delete]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-before-index-delete]
: debugtest_s3_wal_replay[real_s3]
: releaseFailures on Postgres 15
test_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-before-rm-False]
: debugtest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-before-index-delete]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-before-rm]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-before-index-deleted-at]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-during-rm]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-after-rm]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-before-rm]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-before-index-deleted-at]
: releasetest_timeline_delete_works_for_remote_smoke[real_s3]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-after-rm-dir]
: releaseFailures on Postgres 14
test_bulk_insert[neon]
: releasetest_startup
: releasetest_ondemand_download_large_rel[real_s3]
: debugtest_pageserver_chaos
: debugtest_remote_storage_backup_and_restore[False-real_s3]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-before-rm-False]
: release, debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-before-index-deleted-at-False]
: releasetest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-after-rm-dir-False]
: release, debugtest_tenant_delete_smoke[real_s3]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-tenant-delete-before-shutdown-False]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-tenant-delete-before-create-remote-mark-False]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-tenant-delete-before-create-local-mark-False]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-tenant-delete-before-remove-timelines-dir-False]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-before-rm-False]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-tenant-delete-before-create-local-mark-False]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-tenant-delete-before-cleanup-remaining-fs-traces-False]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-tenant-delete-before-remove-timelines-dir-False]
: debugtest_delete_tenant_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-tenant-delete-before-remove-tenant-dir-False]
: debugtest_emergency_relocate_with_branches_createdb[real_s3]
: releasetest_emergency_relocate_with_branches_slow_replay[real_s3]
: release, debugtest_tenants_many[real_s3]
: release, debugtest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-before-index-deleted-at]
: release, debugtest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-before-schedule]
: release, debugtest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-after-rm]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-after-index-delete]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-during-rm]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-before-index-delete]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-before-rm]
: release, debugtest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-during-rm]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-after-rm-metadata]
: releasetest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-before-index-deleted-at]
: debugtest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-before-rm]
: debugtest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-after-rm]
: debugtest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-before-index-delete]
: debugtest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITH_RESTART-real_s3-timeline-delete-after-rm-metadata]
: debugtest_delete_timeline_exercise_crash_safety_failpoints[Check.RETRY_WITHOUT_RESTART-real_s3-timeline-delete-before-schedule]
: debugtest_timeline_resurrection_on_attach[True-real_s3]
: debugtest_s3_wal_replay[real_s3]
: releaseFlaky tests (4)
Postgres 16
test_pageserver_restart[True]
: debugtest_pageserver_with_empty_tenants[real_s3]
: releasePostgres 14
test_pageserver_chaos
: debugtest_pageserver_with_empty_tenants[real_s3]
: releaseTest coverage report is not available
7c16b52 at 2023-10-26T20:30:44.605Z :recycle: