You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* feat(s3): multipart checksums (FIL-620)
Per-part checksums at UploadPart, composite / full-object / default final
checksums at Complete, and the ListParts echo, mirroring the upstream posix
backend over versitygw's utils (composite checksum-of-checksums reader, CRC
combine) and s3err constructors:
- multipart_parts gains a checksum column (00009): the session algorithm's
base64 value, or the internal full-object CRC64NVME of an undeclared
session (never echoed; derives Complete's default final checksum).
- UploadPart negotiates the part algorithm against the session declaration
(mismatch / composite-without-checksum rejections), computes + validates
through a HashReader stack over the ingest pass, persists, and echoes.
- Complete verifies the request's checksum type and every part entry
(multiple / malformed / missing / wrong-algo / wrong-value), folds the
stored part checksums into the final value (COMPOSITE "-N" suffix or
FULL_OBJECT CRC combine), verifies a client-supplied final checksum, and
persists algorithm/value/type on the manifest; the idempotent re-Complete
returns the same checksum fields.
- ObjectManifest gains ChecksumType ("cy"); checksumFields stops hardcoding
FULL_OBJECT so GET/HEAD/ListObjectVersions echo the stored type (empty =
legacy full-object).
- ListParts echoes per-part checksums + the session algorithm/type, or the
literal "null" pair for an undeclared session.
- itest: the 19 checksum rows promote from the UploadPart / ListParts /
CompleteMultipartUpload XFail tables to pass; racey_data_integrity stays
xfail (load-sensitive concurrency, not checksums).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(s3): CopyObject checksum propagation and replacement
A copy without a checksum request carries the source's checksum triple
(algorithm/value/type) to the destination; a request naming a different
x-amz-checksum-algorithm replaces it, streaming the shared body through the
new algorithm once for a full-object value. The CopyObjectResult now
reports the destination checksum fields. Promotes the four checksum rows of
the CopyObject XFail table.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(s3): release shipped segment blobs on DeleteBucket
A shipped catalog segment registers TWO blobs in the bucket's space: the
sealed CAR and its sharded-dag-index (both blob/added by SubmitShard). Hilt
refuses to delete a space that still holds registrations, so any bucket
that lived past the catalog seal age with a successful ship could never be
deleted: DeleteBucket returned BucketNotEmpty with no objects left.
Surfaced by promoting CompleteMultipartUpload/should_verify_final_composite_
checksum — the first conformance case long enough (~11s of commits) to ship
a segment before its teardown.
The index blob's digest was recorded nowhere, so ship now persists it:
SubmitShard returns the index digest, the flush func hands it to
MarkSegmentShipped, and ingot.segments gains an index_digest column
(00010). DeleteBucket quiesces the bucket's log first — joining any
in-flight ship, so a segment can't register its blobs after the release
pass has read the rows (on faster hosts the teardown lands exactly inside
the ship window) — then releases every sealed segment's CAR and every
shipped segment's index from the space before the hilt delete. Releases
are idempotent (removing an unregistered blob is a no-op), so
sealed-but-unshipped CARs are released defensively and retries are safe.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Update bucket/manifest.go comment
Code comment on relevant code section
Co-authored-by: ash <alan138@gmail.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: ash <alan138@gmail.com>
0 commit comments