Skip to main content

BuyerLedgers

Struct BuyerLedgers 

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

The voucher ledger of each lane’s current pool, shared by every concurrent pull on it.

Keyed by LaneKey ({pool_id, signer, provider}) so the ledger a pull issues through is pinned to the exact lane it read: a stale or rotated pool can neither collide with nor evict a different lane’s live ledger. Cardinality stays bounded without that hazard — a rotated pool’s ledger is dropped by Self::get_or_seed the moment no pull still holds it (Arc::strong_count == 1), so at most one live lane per provider lingers, plus any whose pulls are still in flight. That is the buyer store’s bound, made safe against a stale key (#1145 review): the earlier provider-only key evicted the live ledger on ANY pool-id mismatch, which is exactly the collision this type exists to prevent.

Implementations§

Source§

impl BuyerLedgers

Source

pub fn get_or_seed(&self, key: LaneKey, seed: Cumulative) -> Arc<PoolLedger> ⓘ

The ledger to issue this pull’s vouchers through: the live one for key, or a fresh one seeded from seed if there is none.

seed is the lane’s persisted cumulative and the only state a fresh ledger inherits. A hash chain draws its own secret when it opens and is never reopened across a restart (ADR 003 §Resumption folds), so there is nothing else here for a caller to supply and nothing for a stale row to contradict.

An existing entry for the SAME lane wins over seed, and that precedence is the whole point. seed comes from the persisted row that open_or_reuse_pool read; a concurrent pull holding the live ledger may already have issued vouchers the row does not carry yet (it is written on redeem, not on issue). Re-seeding from the row would rewind the watermark and re-create the collision this type exists to prevent.

A DIFFERENT lane addresses a DIFFERENT entry — a rotated or stale pool can neither read nor evict this lane’s ledger. The provider’s other lanes are pruned here, but only those no pull still holds (Arc::strong_count == 1), so a rotation cannot throw away a ledger a concurrent pull is issuing through.

Source

pub fn pool_committed(&self, pool_id: PoolId) -> U256

The pool’s total committed spend: the sum, across every live lane whose LaneKey::pool_id matches pool_id, of that lane’s committed voucher amount.

This is the whole-pool spend the node’s ranged-drive loop gates on (#1506). One buyer pool backs a voucher lane per provider, and the loop assembles a blob across those providers as a sequence of lanes drawing on the SAME deposit. Each lane’s live ledger stays in the map for the whole assembly (a new provider’s lane never evicts another provider’s), so summing them here — including the run currently issuing vouchers, which seeded its own live ledger via Self::get_or_seed — yields the exact cumulative spend against the shared deposit. The live ledgers are the authoritative in-memory watermarks (a persisted row lags, written on redeem, not on issue), so a solvency gate reading this never under-counts a still-in-flight voucher.

Source

pub fn forget(&self, key: LaneKey)

Drop key’s ledger — the lane was retired, so no further voucher can be signed against it.

Keyed by the exact lane, so a concurrent open that already rotated the provider onto a NEW pool is untouched: its ledger lives under a different key and is not thrown away.

Trait Implementations§

Source§

impl Debug for BuyerLedgers

Source§

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

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

impl Default for BuyerLedgers

Source§

fn default() -> Self

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<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> 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<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

Source§

fn into_shared(self) -> Shared

Creates a shared type from an unshared type.
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> MaybeSend for T
where T: Send,

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