Skip to main content

LifecycleManager

Struct LifecycleManager 

Source
pub struct LifecycleManager { /* private fields */ }
Expand description

Per-bucket lifecycle configuration manager.

All read / write operations go through RwLock for thread safety; clones are cheap (Arc<LifecycleManager> is the expected handle shape). actions_total is a parallel RwLock<HashMap<...>> of (bucket, action_label) -> count so the future background scanner can stamp successful actions and operators can GET /metrics to see the running totals (the metric is also surfaced via metrics::counter! — see crate::metrics::record_lifecycle_action).

Implementations§

Source§

impl LifecycleManager

Source

pub fn new() -> Self

Empty manager — no bucket has rules.

Source

pub fn put(&self, bucket: &str, config: LifecycleConfig)

Replace (or create) the lifecycle configuration for bucket. Drops any previously-attached rules in one shot — matches AWS S3 PutBucketLifecycleConfiguration (full replace, no merge).

Source

pub fn get(&self, bucket: &str) -> Option<LifecycleConfig>

Return a clone of the bucket’s configuration, if any.

Source

pub fn delete(&self, bucket: &str)

Drop the bucket’s lifecycle configuration (idempotent — missing bucket is OK).

Source

pub fn to_json(&self) -> Result<String, Error>

JSON snapshot for restart-recoverable state. Pair with Self::from_json.

Source

pub fn from_json(s: &str) -> Result<Self, Error>

Restore from a JSON snapshot produced by Self::to_json. Action counters are intentionally not snapshotted — they’re transient observability data and should reset across process restarts so rate(s4_lifecycle_actions_total[1h]) doesn’t double-count.

Source

pub fn evaluate( &self, bucket: &str, key: &str, object_age: Duration, object_size: u64, object_tags: &[(String, String)], ) -> Option<LifecycleAction>

Evaluate which rule (if any) applies to a single current-version object right now. Walks the bucket’s rules in declaration order; returns the first matching action. Returns None when no rule matches (or when the matching rule is Disabled, or when the bucket has no lifecycle configuration).

Within a single rule the precedence is:

  1. Pick the deepest transition whose days threshold is currently met (= largest days ≤ object age).
  2. Conflict with expiration: if expiration_days <= transition_days for the chosen transition, expiration wins (the rule wants the object gone before it would have been transitioned). Otherwise transition wins (e.g. transition at 30d, expiration at 365d, age 60d → transition fires now, expiration is future).
  3. expiration_date matches when now >= expiration_date and no transition is currently applicable.

object_age is “now - created_at” supplied by the caller — keeping the evaluator pure of the wall clock makes deterministic testing trivial.

Source

pub fn evaluate_with_flags( &self, bucket: &str, key: &str, object_age: Duration, object_size: u64, object_tags: &[(String, String)], flags: EvaluateFlags, ) -> Option<LifecycleAction>

Full-form evaluator with flags for noncurrent-version handling. Use this when the scanner is walking a versioning-enabled bucket; pass is_noncurrent = true for entries that are not the latest non-delete-marker version.

Source

pub fn record_action(&self, bucket: &str, action: &LifecycleAction)

Stamp the per-bucket action counter and bump the matching Prometheus counter. Called by the future scanner after a successful delete / metadata rewrite.

Source

pub fn actions_snapshot(&self) -> HashMap<(String, String), u64>

Read-only snapshot of the per-(bucket, action) counter map. Useful for tests + introspection (/admin/lifecycle/stats style endpoints in the future).

Source

pub fn buckets(&self) -> Vec<String>

All buckets with a lifecycle configuration attached. Sorted for stable scanner ordering.

Trait Implementations§

Source§

impl Debug for LifecycleManager

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for LifecycleManager

Source§

fn default() -> LifecycleManager

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromExt for T

Source§

fn from_<T>(t: T) -> Self
where Self: From<T>,

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoExt for T

Source§

fn into_<T>(self) -> T
where Self: Into<T>,

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T> TryFromExt for T

Source§

fn try_from_<T>(t: T) -> Result<Self, Self::Error>
where Self: TryFrom<T>,

Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> TryIntoExt for T

Source§

fn try_into_<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more