Expand description
v0.5 #34: First-class versioning state machine.
S4-server に object version の own state を持たせる module。これまで versioning は backend (s3s framework) への passthrough でしか機能していなかった が、本 module で S4 自身が
- per-bucket の Versioning state (Enabled / Suspended / Unversioned)
- per-(bucket, key) の version chain (
Vec<VersionEntry>、最新が末尾) - delete marker
- version-id 採番 (UUIDv4)
を所有する。crates/s4-server/src/service.rs の put_object /
get_object / delete_object / list_object_versions /
get_bucket_versioning / put_bucket_versioning handler が S4Service
経由で VersioningManager を呼び出して、AWS S3 wire-compat な振る舞いを
実現する。
§scope (v0.5 #34)
- in-memory only (single instance scope)。multi-instance replication は v0.6+ で別 issue として扱う
to_json/from_jsonで snapshot を取る API は提供する。main.rs側で--versioning-state-fileflag を将来追加する hook として使える- MFA delete はサポートしない (本 task の scope 外)
§semantics
- version_id format: UUIDv4 を 32-char hex (no dash) で表現。AWS 互換
実装では base64-url や custom encoding が多いが、UUIDv4 hex は十分一意で
debug 容易、URL-safe 文字のみで構成され
x-amz-version-idheader /versionIdquery param に何の escape も不要 - null version: Suspended bucket での PUT、または初期 Unversioned bucket で
作成された object の version_id は文字列
"null"。Suspended bucket の同 key への次 PUT は既存 null version を 上書き する (S3 仕様準拠) - delete marker: Enabled bucket への DELETE (version_id 指定なし) は 新規 delete marker (version_id 採番) を chain の末尾に追加する。GET (version_id 指定なし) は最新が delete marker なら NoSuchKey 404 を返す
- specific-version DELETE: version_id を指定した DELETE は当該 entry を chain から物理削除する。delete marker を狙い撃ちで消すと、その下の version が再び latest として可視になる (= “undelete”)。Suspended / Unversioned bucket でも version_id 指定 DELETE は受け付ける (chain 中の null version も狙える)
Structs§
- Delete
Outcome - List
Version Entry list_versionsの戻り値 row。service.rs側で s3sObjectVersion/DeleteMarkerEntryに詰め直す。- List
Versions Page - PutOutcome
record_put/record_deleteの戻り値。handler 側で response のx-amz-version-id等を組み立てるために使う。- Version
Entry - Per-version metadata.
is_delete_markerが true の entry は backend storage に bytes を持たない (= tombstone) —etagは空 /sizeは 0 になる。 - Version
Index - per-(bucket, key) chain (最新版が
Vecの末尾) の in-memory map。 - Versioning
Manager - per-bucket versioning state + per-(bucket, key) version chain を一元管理する
上位 manager。すべての書き込み操作は
RwLockwrite 経由で atomic、すべての 読み出しは read 経由 (chain はVec<VersionEntry>の clone を返す)。 - Versioning
Snapshot - snapshot のシリアライズ format。
to_json/from_json用。
Enums§
- Versioning
State - Per-bucket versioning state。AWS S3 では
Enabled/Suspendedの二択 (作成直後の bucket は status 未設定 = Unversioned 相当) なので、3 値に分けて 管理する。
Constants§
- NULL_
VERSION_ ID - AWS-style
"null"literal は version-id 全体で唯一の予約名。chain 内に 同時に複数存在することは無い (= Suspended bucket は最大 1 entry を保持)。