Skip to main content

TokenBucket

Struct TokenBucket 

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

Lock-free token bucket using atomic CAS operations.

All mutable state is stored in AtomicU64 — no Mutex is acquired on the hot path. Token refill is computed lazily on each acquire / try_acquire call based on elapsed time since the last refill.

Integer arithmetic is used throughout (no f64) for deterministic behaviour and to avoid floating-point CAS issues. Token counts are tracked in milli-tokens (tokens * 1000) to provide sub-token precision while staying in integer domain.

All public methods take &self (not &mut self), enabling concurrent access from multiple tasks via a shared reference.

Implementations§

Source§

impl TokenBucket

Source

pub fn new(rate_bytes_per_sec: u64, burst_bytes: Option<u64>) -> Self

Create a new token bucket with the given rate and optional burst.

rate_bytes_per_sec of 0 produces a bucket that never refills — callers should use TokenBucket::unlimited instead for “no limit” semantics.

Source

pub fn unlimited() -> Self

Create an unlimited token bucket — acquire / try_acquire always succeed instantly without consuming any real tokens.

Source

pub fn is_unlimited(&self) -> bool

Returns true if this bucket has no rate limit.

Source

pub fn rate(&self) -> f64

Returns the configured rate in bytes per second (as f64 for API compat). Returns f64::MAX for unlimited buckets.

Source

pub fn available_tokens(&self) -> f64

Returns the current available tokens (as f64 for API compat). Triggers a lazy refill before reading. Returns f64::MAX for unlimited buckets.

Source

pub async fn acquire(&self, bytes: u64)

Acquire bytes tokens, blocking (async-sleeping) until enough tokens are available.

For requests larger than the burst capacity, this method waits for the deficit and then force-acquires (setting tokens to 0), matching the original implementation’s behaviour of allowing token “debt” clamped to zero. This prevents infinite loops when needed > capacity.

Source

pub fn try_acquire(&self, bytes: u64) -> bool

Non-blocking attempt to acquire bytes tokens. Returns true if tokens were available and deducted, false otherwise.

Source

pub fn set_rate(&self, rate_bytes_per_sec: u64)

Update the refill rate dynamically. Takes effect on the next refill cycle. rate_bytes_per_sec of 0 effectively pauses the bucket (no new tokens).

Source

pub fn set_unlimited(&self, unlimited: bool)

Toggle the unlimited flag. When set to true, acquire/try_acquire always succeed instantly without consuming tokens.

Trait Implementations§

Source§

impl Debug for TokenBucket

Source§

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

Formats the value using the given formatter. 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> 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 = 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, 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