Skip to main content

AdaptiveThreshold

Struct AdaptiveThreshold 

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

A threshold that follows the trend it is judging.

§Why it adapts

A fixed threshold cannot work on both a datacentre path and a mobile one: set low enough to detect congestion on a link with microseconds of jitter, it fires constantly on a link with tens of milliseconds of it. Worse, a fixed threshold is what lets a GCC flow be starved by a concurrent loss-based flow — the queue grows past the fixed point, GCC backs off, the other flow takes the space, and GCC never comes back.

So the threshold rises when the trend is outside it and falls when the trend is inside, slowly, and at different rates: K_u (moving away) is larger than K_d (moving back), so it yields quickly to a genuine overuse and returns to sensitivity only gradually.

Implementations§

Source§

impl AdaptiveThreshold

Source

pub fn new() -> Self

A threshold at the draft’s starting value.

Source

pub fn value_ms(&self) -> f64

The current threshold, in milliseconds.

Source

pub fn update(&mut self, now: Instant, estimate_ms: f64) -> f64

Move the threshold towards estimate_ms, given how long since the last update.

Returns the updated threshold. now is a parameter rather than read from a clock: upstream reads time.Now() here, which is why its own threshold tests cannot pin a trajectory.

Source

pub fn since_update(&self, now: Instant) -> Option<Duration>

How long since this threshold was last updated, if ever.

Trait Implementations§

Source§

impl Clone for AdaptiveThreshold

Source§

fn clone(&self) -> AdaptiveThreshold

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for AdaptiveThreshold

Source§

impl Debug for AdaptiveThreshold

Source§

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

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

impl Default for AdaptiveThreshold

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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, <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.