Skip to main content

Backoff

Struct Backoff 

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

The reconnect delay schedule: doubling from an initial delay to a ceiling, and back to the start after a connection that delivered something.

A plain schedule, with no clock and no socket, so the doubling and the ceiling can be checked as arithmetic. As statements interleaved with a sleep and a live socket they could only be checked by timing a real reconnect, so neither was, and a schedule pinned at its initial value would have hammered an unwell host without failing a test.

The basis is one socket crate’s former copy (src/supervisor.rs), identical to the copies three other socket crates carried. Each copy was deleted for this one in Stories 4.6 to 4.8, and each crate that carried one takes its schedule from here. Two divergence rows stay with each venue:

  • D6. What counts as a connection that delivered something follows the venue’s liveness rule (D5): any frame, a decoded event, or a ping. The call site decides and passes it to after_connection_ended as a bool.
  • D13. polyoxide-core’s RetryConfig::backoff is a different schedule, jittered, for HTTP retries. The two are never unified.
use std::time::Duration;
use polyoxide_ws::Backoff;

let mut backoff = Backoff::new(Duration::from_millis(10), Duration::from_millis(30));
assert_eq!(backoff.take(), Duration::from_millis(10));
assert_eq!(backoff.take(), Duration::from_millis(20));
assert_eq!(backoff.take(), Duration::from_millis(30));
backoff.after_connection_ended(true);
assert_eq!(backoff.take(), Duration::from_millis(10));

Implementations§

Source§

impl Backoff

Source

pub fn new(initial: Duration, max: Duration) -> Self

A schedule starting at initial and doubling towards max.

Both are raised to MIN_BACKOFF first, and initial is then lowered to max: a builder’s backoff(initial, max) takes the two independently, and nothing stops a caller passing them the wrong way round, which would otherwise wait the larger delay once before the ceiling took effect.

Source

pub fn take(&mut self) -> Duration

The delay to wait before the next attempt, advancing the schedule. The one after it doubles, up to the ceiling, saturating rather than overflowing.

Source

pub fn take_at_least(&mut self, floor: Duration) -> Duration

As take, but at least floor, clamped to the ceiling: the wait a refused attempt asked for, such as its Retry-After, may only extend the delay, never shorten it, and never past the ceiling (DRIFT R11). The schedule advances as take’s does.

The rule is polyoxide-core’s for HTTP, where Retry-After only extends the retry delay; the two schedules stay apart (D13).

Source

pub fn after_connection_ended(&mut self, delivered: bool)

Note that a connection ended, and whether it delivered anything.

Resetting on delivered rather than on a successful connect is what stops a host that accepts and immediately closes from pinning the delay at its initial value. A host that reliably delivers exactly one frame before dying still resets the schedule each time; most unhealthy hosts fail before delivering anything.

Trait Implementations§

Source§

impl Clone for Backoff

Source§

fn clone(&self) -> Self

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 Backoff

Source§

impl Debug for Backoff

Source§

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

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

impl Eq for Backoff

Source§

impl PartialEq for Backoff

Source§

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

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

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

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for Backoff

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> 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> 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 = !

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