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(...) を返す。
Trait Implementations§
Source§impl Debug for VersioningManager
impl Debug for VersioningManager
Source§impl Default for VersioningManager
impl Default for VersioningManager
Source§fn default() -> VersioningManager
fn default() -> VersioningManager
Auto Trait Implementations§
impl !Freeze for VersioningManager
impl RefUnwindSafe for VersioningManager
impl Send for VersioningManager
impl Sync for VersioningManager
impl Unpin for VersioningManager
impl UnsafeUnpin for VersioningManager
impl UnwindSafe for VersioningManager
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more