Skip to main content

Jittered

Struct Jittered 

Source
pub struct Jittered<W> { /* private fields */ }
Expand description

Applies jitter to an inner wait strategy’s output.

Created by calling .jitter(max), .full_jitter(), or .equal_jitter() on any wait strategy.

Jitter uses a fast PRNG intended for retry backoff behavior, not for cryptographic use. Cloning a Jittered strategy produces a decorrelated copy — the clone will generate a different jitter sequence.

§Examples

use relentless::{RetryState, Wait, wait};
use core::time::Duration;

// Additive jitter: base + random(0, max_jitter)
let strategy = wait::fixed(Duration::from_millis(50))
    .jitter(Duration::from_millis(10));
let state = RetryState::new(1, None);

let next = strategy.next_wait(&state);
assert!(next >= Duration::from_millis(50));
assert!(next <= Duration::from_millis(60));
use relentless::{RetryState, Wait, wait};
use core::time::Duration;

// Full jitter: random(0, base)
let strategy = wait::fixed(Duration::from_millis(100))
    .full_jitter();
let state = RetryState::new(1, None);

let next = strategy.next_wait(&state);
assert!(next <= Duration::from_millis(100));
use relentless::{RetryState, Wait, wait};
use core::time::Duration;

// Equal jitter: base/2 + random(0, base/2)
let strategy = wait::fixed(Duration::from_millis(100))
    .equal_jitter();
let state = RetryState::new(1, None);

let next = strategy.next_wait(&state);
assert!(next >= Duration::from_millis(50));
assert!(next <= Duration::from_millis(100));

Implementations§

Source§

impl<W> Jittered<W>

Source

pub fn with_seed(self, seed: u64) -> Self

Sets an explicit PRNG seed for reproducible jitter sequences.

Combine with with_nonce to fully pin the PRNG state for deterministic testing.

Source

pub fn with_nonce(self, nonce: u64) -> Self

Overrides the instance-decorrelation nonce.

By default, each Jittered instance (including clones) receives a unique nonce so independent retry loops produce different jitter sequences. Set an explicit nonce when you need deterministic output, such as in tests.

Trait Implementations§

Source§

impl<W: Wait, Rhs: Wait> Add<Rhs> for Jittered<W>

Source§

type Output = WaitCombine<Jittered<W>, Rhs>

The resulting type after applying the + operator.
Source§

fn add(self, rhs: Rhs) -> Self::Output

Performs the + operation. Read more
Source§

impl<W: Clone> Clone for Jittered<W>

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl<W: Debug> Debug for Jittered<W>

Source§

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

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

impl<W: Wait> Wait for Jittered<W>

Source§

fn next_wait(&self, state: &RetryState) -> Duration

Returns the duration to sleep before the next retry attempt.
Source§

fn cap(self, max: Duration) -> WaitCapped<Self>
where Self: Sized,

Clamps the returned duration to at most max.
Source§

fn chain<W2: Wait>(self, other: W2, after: u32) -> WaitChain<Self, W2>
where Self: Sized,

Uses this strategy for the first after attempts, then switches to other.
Source§

fn add<W2: Wait>(self, other: W2) -> WaitCombine<Self, W2>
where Self: Sized,

Adds another wait strategy to this one. Read more
Source§

fn jitter(self, max_jitter: Duration) -> Jittered<Self>
where Self: Sized,

Adds uniformly distributed jitter in [0, max_jitter].
Source§

fn full_jitter(self) -> Jittered<Self>
where Self: Sized,

Replaces the computed delay with a random value in [0, base]. Read more
Source§

fn equal_jitter(self) -> Jittered<Self>
where Self: Sized,

Keeps half the computed delay and jitters the other half. Read more

Auto Trait Implementations§

§

impl<W> !Freeze for Jittered<W>

§

impl<W> !RefUnwindSafe for Jittered<W>

§

impl<W> Send for Jittered<W>
where W: Send,

§

impl<W> !Sync for Jittered<W>

§

impl<W> Unpin for Jittered<W>
where W: Unpin,

§

impl<W> UnsafeUnpin for Jittered<W>
where W: UnsafeUnpin,

§

impl<W> UnwindSafe for Jittered<W>
where W: UnwindSafe,

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