pub struct VersioningManager { /* private fields */ }Expand description
per-bucket versioning state + per-(bucket, key) version chain を一元管理する
上位 manager。すべての書き込み操作は RwLock write 経由で atomic、すべての
読み出しは read 経由 (chain は Vec<VersionEntry> の clone を返す)。
Implementations§
Source§impl VersioningManager
impl VersioningManager
Sourcepub fn new_version_id() -> String
pub fn new_version_id() -> String
新 version_id を採番 (UUIDv4 を simple() = 32-char hex で表現)。
AWS S3 の x-amz-version-id は base64-url 風の不透明文字列だが、S4 では
「URL-safe な短い hex」を採用する。32 char で衝突確率は実用上ゼロ
(UUIDv4 = 122-bit randomness)、versionId query param で escape 不要、
debug log にそのまま貼れる。
Sourcepub fn state(&self, bucket: &str) -> VersioningState
pub fn state(&self, bucket: &str) -> VersioningState
Bucket の versioning state を取得。未設定は Unversioned。
Sourcepub fn set_state(&self, bucket: &str, state: VersioningState)
pub fn set_state(&self, bucket: &str, state: VersioningState)
put_bucket_versioning handler から呼ぶ。
Sourcepub fn record_put(
&self,
bucket: &str,
key: &str,
etag: String,
size: u64,
) -> PutOutcome
pub fn record_put( &self, bucket: &str, key: &str, etag: String, size: u64, ) -> PutOutcome
PUT 経路 (テスト / state machine 単独実証用)。state に応じて新 version_id を
採番 (Enabled) / "null" を使う (Suspended / Unversioned)。Suspended は既存
null version を overwrite する (chain 中の null version を 1 件まで restrict)。
service.rs の handler は backend write の前後で new_version_id の
事前採番 + [commit_put_with_version] を使うので本関数を直接は呼ばないが、
state machine 単体テスト + 公開 API として残しておく (snapshot loader 等から
programmatic に index を組む経路で便利)。
Sourcepub fn commit_put_with_version(
&self,
bucket: &str,
key: &str,
entry: VersionEntry,
)
pub fn commit_put_with_version( &self, bucket: &str, key: &str, entry: VersionEntry, )
事前採番済 VersionEntry を chain に commit する。service.rs の PUT
handler は backend write の 前 に [new_version_id] で vid を確保し
(rewrite 用)、backend write が成功したら本関数で commit する。これにより
response の x-amz-version-id と shadow backend key (<key>.__s4ver__/<vid>)
が同じ vid で揃う。
Suspended (vid = "null") を commit する場合は既存 null version を物理
overwrite する (S3 仕様: Suspended bucket の null version は唯一)。Enabled の
vid (UUIDv4) を commit する場合は単純に末尾 push。
Sourcepub fn record_delete(&self, bucket: &str, key: &str) -> DeleteOutcome
pub fn record_delete(&self, bucket: &str, key: &str) -> DeleteOutcome
version_id 指定なしの DELETE 経路。
- Enabled → 新 version_id を採番した delete marker を chain 末尾に push。
DeleteOutcome.version_id = Some(<new_vid>)、is_delete_marker = true。 - Suspended → null delete marker を 1 件追加 (既存 null version を replace、 S3 仕様)。
- Unversioned → chain 全消し (= 単純物理削除)。
Sourcepub fn record_delete_specific(
&self,
bucket: &str,
key: &str,
version_id: &str,
) -> Option<DeleteOutcome>
pub fn record_delete_specific( &self, bucket: &str, key: &str, version_id: &str, ) -> Option<DeleteOutcome>
version_id 指定 DELETE 経路。当該 entry を chain から物理削除する。 Enabled / Suspended / Unversioned 関係なく動く (specific-version DELETE は state に依存しない S3 仕様)。chain が空になった場合は entry を index から 削除する (cleanup)。
Sourcepub fn lookup_version(
&self,
bucket: &str,
key: &str,
version_id: &str,
) -> Option<VersionEntry>
pub fn lookup_version( &self, bucket: &str, key: &str, version_id: &str, ) -> Option<VersionEntry>
version_id 指定 GET 経路。当該 entry の clone を返す。
Sourcepub fn lookup_latest(&self, bucket: &str, key: &str) -> Option<VersionEntry>
pub fn lookup_latest(&self, bucket: &str, key: &str) -> Option<VersionEntry>
最新 (= chain 末尾) の version を返す。chain 末尾が delete marker の場合
もそのまま返す — 客側 (handler) が is_delete_marker を見て 404 を
投げるかどうか決める。
Sourcepub fn list_versions(
&self,
bucket: &str,
prefix: Option<&str>,
key_marker: Option<&str>,
version_id_marker: Option<&str>,
max_keys: usize,
) -> ListVersionsPage
pub fn list_versions( &self, bucket: &str, prefix: Option<&str>, key_marker: Option<&str>, version_id_marker: Option<&str>, max_keys: usize, ) -> ListVersionsPage
list_object_versions 経路。bucket 内の全 (key, version) を S3 仕様の
順序 (key asc → 同 key 内は新→旧) に展開する。
prefix で key 先頭一致 filter、key_marker (key より大), version_id_marker
(key_marker と組で使う、当該 version より後の entry から) で paginate、
max_keys 件で truncate。
戻り値は (versions, delete_markers, is_truncated, next_key_marker, next_version_id_marker)。is_truncated = true の時のみ next_* が
Some(...) を返す。