Skip to main content

PurgeReport

Struct PurgeReport 

Source
#[non_exhaustive]
pub struct PurgeReport { pub tasks_deleted: u64, pub orphan_rows_deleted: u64, pub idempotency_keys_deleted: u64, pub batches: u32, pub complete: bool, }
Expand description

What one call to purge_expired did.

#[non_exhaustive]: read its fields, do not construct or exhaustively destructure it. A sweep that learns to count something new should not be a breaking change — 0.13.0’s breaking list already carries one renamed field of this struct.

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§tasks_deleted: u64

Task rows deleted.

§orphan_rows_deleted: u64

Side-table rows this sweep had to reclaim itself: artifact-journal rows and event-log rows whose task was deleted.

Normally zero, and that is the healthy reading: both tables have an ON DELETE CASCADE, so on a pool with foreign_keys=ON — which SqliteTaskStore::new sets — the rows go with the task and the sweep finds nothing left to do. A non-zero count means rows had outlived their task, which happens when from_pool was handed a pool without the pragma.

§It is zero on PostgreSQL because nothing counts there

Only the SQLite sweep runs anti-join deletes; the PostgreSQL one has no orphan statement at all, so this field is structurally zero on both Postgres stores rather than observed to be. That is a deliberate omission and not an oversight: PostgreSQL has no per-session equivalent of foreign_keys=OFF, so a declared ON DELETE CASCADE always fires and there is nothing for a sweep to find.

The residual case it does not cover is a caller who handed from_pool a database in which task_events or tenant_task_events already existed without the foreign key — CREATE TABLE IF NOT EXISTS leaves such a table alone. Rows can then be stranded there and no Postgres sweep will reclaim them. Declare the tables from this crate’s own DDL, or from its migration runner, and the case does not arise.

Since 0.13 the SQLite sweep runs on every purge rather than only on one that deleted a task: a purge that fails part way strands rows that outlive it, and the sweep is what reclaims them.

§idempotency_keys_deleted: u64

Idempotency keys deleted for being older than RetentionPolicy::idempotency_key_max_age.

Zero when that is None, and zero on a sweep that finds none expired. Unlike orphan_rows_deleted a non-zero count here is the healthy reading, not a warning: it is the sweep doing the job it was given.

§batches: u32

Batches executed.

§complete: bool

false when RetentionPolicy::max_batches stopped the sweep with work still to do, so a caller can tell “nothing left” from “ran out of budget” instead of inferring it from a count.

Trait Implementations§

Source§

impl Clone for PurgeReport

Source§

fn clone(&self) -> PurgeReport

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for PurgeReport

Source§

impl Debug for PurgeReport

Source§

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

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

impl Default for PurgeReport

Source§

fn default() -> PurgeReport

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

impl Eq for PurgeReport

Source§

impl PartialEq for PurgeReport

Source§

fn eq(&self, other: &PurgeReport) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for PurgeReport

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<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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> FutureExt for T

Source§

fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
Source§

fn with_current_context(self) -> WithContext<Self> ⓘ

Attaches the current Context to this type, returning a WithContext wrapper. Read more
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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
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<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