test: verify a bucket migrated to the tenant-rooted layout #1870 - #1893
Open
DmytroZaichenkoDev wants to merge 3 commits into
Open
DmytroZaichenkoDev wants to merge 3 commits into
DmytroZaichenkoDev wants to merge 3 commits into
Conversation
DmytroZaichenkoDev
force-pushed
the
feat/issue-1870-3-bucket-verifier
branch
from
September 2, 2026 14:31
087abbe to
22acbe4
Compare
DmytroZaichenkoDev
force-pushed
the
feat/issue-1870-2-access-differ
branch
from
September 2, 2026 14:31
0a6cc22 to
132276a
Compare
DmytroZaichenkoDev
force-pushed
the
feat/issue-1870-3-bucket-verifier
branch
from
September 2, 2026 15:07
22acbe4 to
0adef3f
Compare
DmytroZaichenkoDev
force-pushed
the
feat/issue-1870-2-access-differ
branch
2 times, most recently
from
September 2, 2026 15:23
5d65dbb to
b4bc5ac
Compare
DmytroZaichenkoDev
force-pushed
the
feat/issue-1870-3-bucket-verifier
branch
2 times, most recently
from
September 2, 2026 15:56
0e59c3d to
aebd9b1
Compare
DmytroZaichenkoDev
force-pushed
the
feat/issue-1870-2-access-differ
branch
from
September 2, 2026 15:56
b4bc5ac to
480ed3a
Compare
DmytroZaichenkoDev
force-pushed
the
feat/issue-1870-3-bucket-verifier
branch
from
September 3, 2026 10:53
aebd9b1 to
2763d4a
Compare
DmytroZaichenkoDev
force-pushed
the
feat/issue-1870-2-access-differ
branch
from
September 3, 2026 10:53
480ed3a to
3b03a3a
Compare
DmytroZaichenkoDev
force-pushed
the
feat/issue-1870-3-bucket-verifier
branch
from
September 3, 2026 11:58
2763d4a to
d3ba078
Compare
DmytroZaichenkoDev
force-pushed
the
feat/issue-1870-2-access-differ
branch
from
September 3, 2026 11:58
3b03a3a to
4415dcb
Compare
DmytroZaichenkoDev
marked this pull request as ready for review
September 3, 2026 15:05
DmytroZaichenkoDev
requested review from
Oleksii-Klimov and
astsiapanay
as code owners
September 3, 2026 15:05
astsiapanay
reviewed
Sep 4, 2026
astsiapanay
approved these changes
Sep 4, 2026
Copies a legacy tree into the tenant-rooted layout, checks everything arrived, then boots a tenant-rooted core onto the copy with an empty cache and reads it all back. This is the only instrument that crosses layouts. The other two start empty and each run reads only its own writes, so neither can see a failure that happens only to data written under one layout and read under the other, which is the whole of what P2 is about to do. Read-back compares what each resource returned before the move with what it returns after, rather than asserting a 200: the question is whether migration changed anything, not whether every fixture is readable. The copier is a stand-in for the migrator P2 will build, not that migrator. It exists so the verifier has something to verify, and so the questions the verifier asks are settled before the real one lands. Two of those questions came out of building it. A byte-perfect copy still produces an unreadable bucket: whether an object is compressed is recorded beside it rather than inside it, along with its etag, author and creation time, so a copy that keeps every byte and drops the metadata reads back as a parse error. Inventory and checksums both passed while that was true, which is why the verifier compares metadata too. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The verifier moved bytes but nothing it moved was ciphertext, so the one hazard specific to encrypted resources — an AAD derived from a path that migration changes — was never exercised. The seed now stores a user-authored external service with a client secret, and serving it after migration is a named check like the rules document: before/after equality alone would also pass if both reads failed identically. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
DmytroZaichenkoDev
force-pushed
the
feat/issue-1870-3-bucket-verifier
branch
from
September 7, 2026 11:50
1a9cf84 to
f7c5375
Compare
DmytroZaichenkoDev
force-pushed
the
feat/issue-1870-2-access-differ
branch
from
September 7, 2026 11:50
da81845 to
962ac0f
Compare
This file contains hidden or 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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #1892.
Copies a legacy tree into the tenant-rooted layout, checks everything arrived, then boots a tenant-rooted core onto the copy with an empty cache and reads it all back.
The only instrument that crosses layouts. The other two start empty and each run reads only its own writes, so neither can see a failure that happens only to data written under one layout and read under the other — which is the whole of what P2 is about to do.
What it compares:
content-encoding,content-type,etag,author,created_atpublic/rules/rulesRead-back is a before/after comparison rather than an assertion of 200: the question is whether migration changed anything, not whether every fixture happens to be readable.
BucketCopieris a stand-in for the migrator P2 will build, not that migrator. It exists so the verifier has something to verify, and so the questions the verifier asks are settled before the real one lands. Swap it when P2 arrives.What building it turned up: a byte-perfect copy still produces an unreadable bucket. Whether an object is compressed is recorded beside it rather than inside it, along with its etag, author and creation time — so a copy that keeps every byte and drops the metadata reads back as a parse error. Only some resources are affected, since small ones are stored uncompressed, which is what makes it easy to miss.
Inventory and checksums both passed while that was true. That is why the verifier compares metadata as well, and it is the thing P2's migrator most needs to get right.
🤖 Generated with Claude Code