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): implement object tagging (VersionState second tenant)
Implements docs/s3-object-tagging.md. Tags live in the per-key
version-state tree the object-lock design built: the three per-version
methods run the shared check order with no bucket gate (the state-target
and state-write helpers gain a require-lock flag), the merge rule carries
lock fields across tag writes and tags across lock writes, and
DeleteObjectTagging exercises the empty-block elision rule for real. A
version without tags answers the empty set, never a sentinel.
Creation-time stamping covers the x-amz-tagging header on PutObject
(parsed via backend.ParseObjectTags before ingest, so an invalid header
uploads nothing), the copy tagging directive (COPY inherits the resolved
source version's tags, REPLACE takes the request header), and the
multipart carry (the raw header validated at create, stored on the
session, stamped at Complete). GET/HEAD gain the x-amz-tagging-count
echo from the same state-block fetch as the lock headers. Tags on
unversioned buckets make the write-rule discard cleanup live: a
null-replacing PUT prunes the old version's tag entry in the same
commit.
itest gains the three tagging categories and the eight Versioning_*
tagging rows, and promotes PutObject_tagging,
CreateMultipartUpload_with_tagging, CopyObject_should_copy_tagging,
CopyObject_should_replace_tagging, GetObject_success, and
HeadObject_success (the last two XFailed on the TagCount echo).
DeleteObjectTagging_expected_bucket_owner is XFail: the hilt flow
substitutes the root access key as the ACL owner, so the tenant's
correct-owner request 403s — the existing *_expected_owner surface.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0 commit comments