Skip to main content

LimiterConfig

Struct LimiterConfig 

Source
pub struct LimiterConfig {
    pub enabled: bool,
    pub min_concurrency: usize,
    pub max_concurrency: usize,
    pub window_ops: usize,
    pub min_window_ops: usize,
    pub success_target: f64,
    pub timeout_ceiling: f64,
    pub latency_inflation_factor: f64,
    pub latency_ewma_alpha: f64,
    pub slow_start_ramp_threshold: usize,
    pub latency_decrease_enabled: bool,
    pub retain_increase_credit_on_decrease: bool,
}
Expand description

Per-limiter configuration. Carries the shared adaptive parameters plus the channel-specific max_concurrency. Held behind an Arc so cloning a Limiter is a refcount bump rather than a struct copy (avoids allocating AdaptiveConfig-worth of bytes per chunk in hot loops).

Fields§

§enabled: bool§min_concurrency: usize§max_concurrency: usize§window_ops: usize§min_window_ops: usize§success_target: f64§timeout_ceiling: f64§latency_inflation_factor: f64§latency_ewma_alpha: f64§slow_start_ramp_threshold: usize

While current < slow_start_ramp_threshold, a Decrease halves the cap but does NOT permanently exit slow-start — the next healthy window can double the cap back up. Above the threshold, a Decrease exits slow-start and the controller transitions to classic AIMD (+1 per healthy window).

0 (the default) reproduces the original behaviour: any Decrease at any cap permanently exits slow-start. The fetch channel sets this to its max_concurrency so download concurrency keeps doubling toward the ceiling instead of crawling +1 per window — additive growth simply cannot reach a useful cap on a fast-but-lossy link before the file finishes. See AdaptiveController::new.

§latency_decrease_enabled: bool

When false, the p95-latency-vs-baseline comparison never triggers a Decrease (it still updates the baseline). The fetch channel disables it because chunk_get’s observed latency includes the internal retry sleep and slow retry-sweep for the chunks that needed one, so a window with a couple of retry-path chunks has a wildly inflated p95 that is retry variance, not congestion. Genuine fetch congestion still surfaces as a rising Ok(None) (Timeout) rate, which the timeout_ceiling check catches.

§retain_increase_credit_on_decrease: bool

When true, a Decrease does NOT reset samples_since_increase, so evidence already accrued toward the next Increase survives a transient Decrease instead of being zeroed.

The default (false) reproduces the original asymmetric gate: an Increase needs a full fresh window_ops of samples, a Decrease needs only min_window_ops, AND a Decrease resets the increase counter. On a channel where decreases fire faster than a full increase window can accrue, that combination permanently starves growth — the store cap sat pinned at its cold-start floor of 8 for a whole 530-chunk upload (V2-554). The store channel sets this true so a few-percent shortfall rate can no longer deny the cap its next doubling: the accrued increase credit persists across the transient Decrease, and the next genuinely healthy window (evaluate returns Increase) can act on it. Sustained unhealthiness still holds the cap down because evaluate keeps returning Decrease — this only stops isolated dips from zeroing progress.

Trait Implementations§

Source§

impl Clone for LimiterConfig

Source§

fn clone(&self) -> LimiterConfig

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 Debug for LimiterConfig

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

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

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

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
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> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
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> 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> 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 = 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