Skip to main content

TokenLedger

Struct TokenLedger 

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

One execution’s reservations against its own ceiling and the shared aggregate together.

Both reservations are taken together and both unwound if either fails, so a refused reservation leaves neither counter charged.

Releasing on drop is what makes the aggregate usable for execution lifetime: an execution ends by having its budget holder dropped, not by reconciling every reservation first, so without this the reservation of every ended execution would be held forever and the aggregate would ratchet to its cap.

Held reserve is the deliberate exception. It releases from the per-execution ledger, which is over, but stays charged against the aggregate. Releasing indeterminate spend from the aggregate would let it escape the server-wide ceiling entirely: a caller who can reliably induce null usage pays real money the aggregate forgets at execution end, so N executions each under the per-execution ceiling could exceed the server-wide one without ever tripping it.

Implementations§

Source§

impl TokenLedger

Source

pub fn new(limits: LedgerLimits, aggregate: SharedTokenBudget) -> Self

Source

pub fn used(&self) -> u64

Tokens this execution currently holds against its ceiling.

Source

pub fn held(&self) -> u64

The part of Self::used held for unreported usage.

Source

pub fn reserve(&self, tokens: u64) -> Result<(), LedgerRefusal>

Reserve tokens against this execution and the aggregate.

Source

pub fn reconcile(&self, reserved: u64, reported: u64, indeterminate: u64)

Reconcile a completed dispatch down from its reserved estimate to what the provider actually reported.

reported is the summed usage of the elements the provider gave counts for; indeterminate is the reserve belonging to elements it reported nothing for. The indeterminate part is not released — None means indeterminate, not free, since a throttled call may still have been billed — and is instead carried as held reserve, bounded by LedgerLimits::max_held_tokens.

Source§

impl TokenLedger

Source

pub fn settle_held(&self, held_estimate: u64, reported: u64, indeterminate: u64)

Settle a sub-batch whose held_estimate was already moved to held (via Self::reconcile with the whole estimate indeterminate) now that its outcome is known.

The estimate leaves held; reported stays charged as spend, indeterminate goes back to held, and the rest is released to this execution and the aggregate. A reported above the estimate is spend that already happened: the excess is charged (saturating, never refused) even if that passes a cap, and the next reservation is then refused.

Trait Implementations§

Source§

impl Debug for TokenLedger

Source§

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

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

impl Drop for TokenLedger

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. 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<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> 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> 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: Sized + 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: Sized + 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 = !

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<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