Skip to main content

DirectionState

Struct DirectionState 

Source
struct DirectionState {
    acquirer: BandwidthAcquirer,
    max_chunk: NonZero<usize>,
}
Expand description

Rate-limiting state for a single direction.

It has everything needed to rate limit one direction that is a BandwidthAcquirer and an optional maximum chunk.

This is used by the GlobalRateLimitedReader and GlobalRateLimitedWriter as they share that same behavior for each direction (read and write).

Fields§

§acquirer: BandwidthAcquirer

Acquirer used to get a Permit from the pool for each poll.

§max_chunk: NonZero<usize>

Cap on how many tokens a single IO can request.

An IO requests at most this many tokens as long as the buffer is bigger.

Implementations§

Source§

impl DirectionState

Source

fn new(acquirer: BandwidthAcquirer, max_chunk: NonZero<usize>) -> Self

Constructor.

Source

fn poll_acquire( &mut self, cx: &mut Context<'_>, tokens: usize, ) -> Poll<Result<Permit, Error>>

Acquire a permit for an IO of the given amount of tokens.

The request is capped to the state’s max chunk. The grant itself is capped to the pool capacity so the returned Permit can hold less than tokens.

The Permit is handed to the caller rather than kept here so that it lives exactly as long as the IO attempt it is for. If the underlying IO turns out to be Poll::Pending, the caller drops it and the tokens are refunded to the pool instead of being parked for as long as the connection is not ready. That matters with many connections as we don’t want to hold off ready connections on already allocated permits for non ready connections.

The cost is that the caller re-acquires on the next poll rather than resuming with what it already had. It is by design.

Source

fn commit(permit: Permit, tokens: usize)

Claim tokens on permit after a successful IO.

tokens must not exceed what the permit was granted. Callers get that by capping the IO to Permit::granted.

The permit is consumed so whatever is left unclaimed is refunded on drop.

Trait Implementations§

Source§

impl Debug for DirectionState

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