Skip to main content

BandwidthPool

Struct BandwidthPool 

Source
pub struct BandwidthPool {
    bucket: Arc<AtomicTokenBucket>,
    requests: UnboundedSender<(u64, Arc<RefillWaiter>)>,
}
Expand description

A shareable bandwidth pool.

Use Self::share to give it to each task requiring bandwidth limitation.

Clone is deliberately not implemented so that handing this around can not be mistaken for creating a second pool with its own bandwidth. There is exactly one pool per Self::new call.

Each task needs to hold a BandwidthAcquirer in order to request bandwidth permits from this pool.

Fields§

§bucket: Arc<AtomicTokenBucket>

The shared token bucket the fast path claims from.

§requests: UnboundedSender<(u64, Arc<RefillWaiter>)>

Ingress for acquirers that failed the fast path.

Sending a BwRequest here both enqueues it and wakes the BandwidthRefiller

Unbounded because we never want an acquirer’s enqueue to block. the number of in-flight requests is bounded by the number of acquirers.

Implementations§

Source§

impl BandwidthPool

Source

pub fn new(capacity: u64) -> (BandwidthPool, BandwidthRefiller)

Create a new pool that can hold up to capacity tokens, and its associated refiller BandwidthRefiller that needs to be run in its own task.

The pool starts full and capacity tokens are immediately available to the fast path.

Source

pub fn share(&self) -> BandwidthPool

Return another BandwidthPool that is the same as this one.

The tokens are not duplicated, this is so you can share the pool with other tasks/objects.

Source

pub fn new_acquirer(&self) -> BandwidthAcquirer

Return a new BandwidthAcquirer associated to this pool.

The number of tokens to acquire is chosen per BandwidthAcquirer::poll_acquire call, so a single acquirer can be reused for requests of different sizes.

It is through an acquirer that one can get permission to use bandwidth. See BandwidthAcquirer::poll_acquire.

Source

pub fn capacity(&self) -> u64

The maximum number of tokens this pool can hold (its burst).

Source

fn is_closed(&self) -> bool

Return true iff the refiller is gone, meaning this pool is closed.

Source

fn try_acquire(&self, tokens: u64) -> Option<Permit>

Try to take tokens from the pool without waiting.

A request above the pool capacity is clamped to it by the bucket it self so the permit can hold less than what was asked. The caller learns what it got with Permit::granted.

Returns Some(permit) if there were tokens available right now, or None if the bucket is empty.

This never blocks and never enqueues. It is the fast path that the other acquisition methods use first.

Trait Implementations§

Source§

impl Debug for BandwidthPool

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