RateLimiter

Struct RateLimiter 

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

Rate Limiter that works on both bandwidth and ops/s limiting.

Bandwidth (bytes/s) and ops/s limiting can be used at the same time or individually.

Implementation uses a single timer through TimerFd to refresh either or both token buckets.

Its internal buckets are ‘passively’ replenished as they’re being used (as part of consume() operations). A timer is enabled and used to ‘actively’ replenish the token buckets when limiting is in effect and consume() operations are disabled.

RateLimiters will generate events on the FDs provided by their AsRawFd trait implementation. These events are meant to be consumed by the user of this struct. On each such event, the user must call the event_handler() method.

Implementations§

Source§

impl RateLimiter

Source

pub fn new( bytes_total_capacity: u64, bytes_one_time_burst: u64, bytes_complete_refill_time_ms: u64, ops_total_capacity: u64, ops_one_time_burst: u64, ops_complete_refill_time_ms: u64, ) -> Result<Self>

Creates a new Rate Limiter that can limit on both bytes/s and ops/s.

§Arguments
  • bytes_total_capacity - the total capacity of the TokenType::Bytes token bucket.
  • bytes_one_time_burst - initial extra credit on top of bytes_total_capacity, that does not replenish and which can be used for an initial burst of data.
  • bytes_complete_refill_time_ms - number of milliseconds for the TokenType::Bytes token bucket to go from zero Bytes to bytes_total_capacity Bytes.
  • ops_total_capacity - the total capacity of the TokenType::Ops token bucket.
  • ops_one_time_burst - initial extra credit on top of ops_total_capacity, that does not replenish and which can be used for an initial burst of data.
  • ops_complete_refill_time_ms - number of milliseconds for the TokenType::Ops token bucket to go from zero Ops to ops_total_capacity Ops.

If either bytes/ops size or refill_time are zero, the limiter is disabled for that respective token type.

§Errors

If the timerfd creation fails, an error is returned.

Source

pub fn consume(&mut self, tokens: u64, token_type: TokenType) -> bool

Attempts to consume tokens and returns whether that is possible.

If rate limiting is disabled on provided token_type, this function will always succeed.

Source

pub fn manual_replenish(&mut self, tokens: u64, token_type: TokenType)

Adds tokens of token_type to their respective bucket.

Can be used to manually add tokens to a bucket. Useful for reverting a consume() if needed.

Source

pub fn is_blocked(&self) -> bool

Returns whether this rate limiter is blocked.

The limiter ‘blocks’ when a consume() operation fails because there was not enough budget for it. An event will be generated on the exported FD when the limiter ‘unblocks’.

Source

pub fn event_handler(&mut self) -> Result<(), RateLimiterError>

This function needs to be called every time there is an event on the FD provided by this object’s AsRawFd trait implementation.

§Errors

If the rate limiter is disabled or is not blocked, an error is returned.

Source

pub fn update_buckets(&mut self, bytes: BucketUpdate, ops: BucketUpdate)

Updates the parameters of the token buckets associated with this RateLimiter.

Source

pub fn bandwidth(&self) -> Option<&TokenBucket>

Returns an immutable view of the inner bandwidth token bucket.

Source

pub fn ops(&self) -> Option<&TokenBucket>

Returns an immutable view of the inner ops token bucket.

Trait Implementations§

Source§

impl AsRawFd for RateLimiter

Source§

fn as_raw_fd(&self) -> RawFd

Provides a FD which needs to be monitored for POLLIN events.

This object’s event_handler() method must be called on such events.

Will return a negative value if rate limiting is disabled on both token types.

Source§

impl Debug for RateLimiter

Source§

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

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

impl Default for RateLimiter

Source§

fn default() -> Self

Default RateLimiter is a no-op limiter with infinite budget.

Source§

impl From<&RateLimiter> for RateLimiterConfig

Source§

fn from(rl: &RateLimiter) -> Self

Converts to this type from the input type.
Source§

impl PartialEq for RateLimiter

Source§

fn eq(&self, other: &RateLimiter) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Persist<'_> for RateLimiter

Source§

type State = RateLimiterState

The type of the object representing the state of the component.
Source§

type ConstructorArgs = ()

The type of the object holding the constructor arguments.
Source§

type Error = Error

The type of the error that can occur while constructing the object.
Source§

fn save(&self) -> Self::State

Returns the current state of the component.
Source§

fn restore( _: Self::ConstructorArgs, state: &Self::State, ) -> Result<Self, Self::Error>

Constructs a component from a specified state.
Source§

impl TryInto<RateLimiter> for RateLimiterConfig

Source§

type Error = Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<RateLimiter, Self::Error>

Performs the conversion.

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> AsAny for T
where T: Any,

Source§

fn as_any(&self) -> &(dyn Any + 'static)

Return the immutable any encapsulated object.
Source§

fn as_mut_any(&mut self) -> &mut (dyn Any + 'static)

Return the mutable encapsulated any object.
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
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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.

§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V