Skip to main content

RoundRobin

Struct RoundRobin 

Source
pub struct RoundRobin {
    pub next_backend: u32,
    /* private fields */
}
Expand description

Round-robin selection, weighted by weight through smooth weighted round robin (the nginx ngx_http_upstream_get_peer scheme).

§Equal weights: the cursor

When every candidate carries the same weight — the default, since an unset weight reads as DEFAULT_WEIGHT — the selection is the historical cursor over the candidate view: position next_backend % len, then the cursor advances. The weighted scheme would visit a fixed set in the same order, but the cursor is what decides how a selection continues once the set shrinks or grows (a backend backs off, recovers, or is excluded by a retry), so keeping it for equal weights keeps every such sequence exactly as it was.

§Unequal weights: smooth weighted round robin

Each backend of the list carries a running current weight. A selection adds every candidate’s weight to its current, picks the candidate with the largest current (the first in view order on a tie), and subtracts the sum of the candidates’ weights from the winner’s. Over a fixed set, a backend of weight w is picked exactly w times in every Σw selections, and the picks interleave rather than bunch: weights 5, 1, 1 yield a a b a c a a, not a a a a a b c.

The weight is backend_weight’s, clamped to at least 1, as for Rendezvous and Maglev: a 0 or negative weight leaves a backend in the rotation at the smallest share, never out of it.

The running weights are indexed by list position. Self::rebuild, which the backend list calls whenever a backend is added, removed or reweighted, resets them, off the datapath; a backend that is not a candidate of one selection keeps its running weight for the next.

Telling the two cases apart reads every candidate’s weight on each selection. That is deliberate: the candidates are the eligible subset of the list, which changes with health and retries, so a flag cached on the list could not say whether THIS subset is uniform.

Fields§

§next_backend: u32

Implementations§

Source§

impl RoundRobin

Source

pub fn new() -> Self

Trait Implementations§

Source§

impl Debug for RoundRobin

Source§

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

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

impl Default for RoundRobin

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl LoadBalancingAlgorithm for RoundRobin

Source§

fn next_available_backend( &mut self, _key: Option<u64>, backends: Candidates<'_>, ) -> Option<Rc<RefCell<Backend>>>

Select the next backend among candidates. Read more
Source§

fn rebuild(&mut self, backends: &[Rc<RefCell<Backend>>])

Called by the control plane when the live backend set for a cluster changes, so table-based policies (Maglev) can recompute their lookup table off the datapath. The default is a no-op; Maglev rebuilds its table, and RoundRobin (with the round-robin fallback of Rendezvous and Maglev) resets its running weights.

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<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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> 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> Same for T

Source§

type Output = T

Should always be Self
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.