Skip to main content

AddressList

Struct AddressList 

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

A structure to manage DAPI addresses to select from for DapiRequest execution.

Address selection is sticky: requests rotate over a small active set of addresses (5 by default, see AddressList::with_active_set_size) and the rest of the list serves as failover standby (see AddressList::get_live_address).

Implementations§

Source§

impl AddressList

Source

pub fn new() -> Self

Creates an empty AddressList with default base ban time.

Source

pub fn with_settings(base_ban_period: Duration) -> Self

Creates an empty AddressList with adjustable base ban time.

Source

pub fn with_active_set_size(self, size: usize) -> Self

Set how many addresses receive traffic at a time.

Defaults to 5. 0 is clamped to 1. Smaller values maximize connection reuse, larger values spread load over more nodes. The effective size is additionally capped by the number of live addresses, so a very large value (e.g. usize::MAX) disables stickiness and round-robins over the whole list.

The size lives in the rotation state shared by every clone of this list, so it applies to all clones and takes effect on the next selection (shrinking drops the excess members).

Source

pub fn ban(&self, address: &Address) -> bool

Bans address Returns false if the address is not in the list.

Back-compat shim for AddressList::ban_with_reason with no reason.

Source

pub fn ban_with_reason(&self, address: &Address, reason: Option<String>) -> bool

Bans address, recording the reason for the ban. Returns false if the address is not in the list.

Source

pub fn ban_for( &self, address: &Address, period: Duration, reason: Option<String>, ) -> bool

Ban the address for an exact period (server-advertised); delegates to AddressStatus::ban_for — see that method for the full contract including the ban_count floor and ladder side-effect.

Returns false if the address is not in the list.

Source

pub fn unban(&self, address: &Address) -> bool

Clears address’ ban record Returns false if the address is not in the list.

Source

pub fn is_banned(&self, address: &Address) -> bool

Check if the address is banned.

Source

pub fn add(&mut self, address: Address) -> bool

Adds a node Address to AddressList Returns false if the address is already in the list.

Source

pub fn remove(&mut self, address: &Address) -> Option<AddressStatus>

Remove address from the list Returns AddressStatus if the address was in the list.

Source

pub fn add_uri(&mut self, uri: Uri) -> bool

👎Deprecated

Add a node Address to AddressList by Uri. Returns false if the address is already in the list.

Source

pub fn get_live_address(&self) -> Option<Address>

Select a not-banned address to send the next request to.

Not a pure getter: every call advances the shared rotation cursor and may promote or retire active-set members, steering traffic for all clones of this list.

Selection is sticky: requests rotate round-robin over a small active set of addresses (see AddressList::with_active_set_size) instead of sampling the whole list, so connections to those hosts stay warm. An active address that got banned, removed or evicted on failover (see AddressList::evict_from_rotation) is dropped from the set here and a random live standby address is promoted in its place. Each slot also expires after a jittered lifetime (5–7.5 minutes). Evicted and expired members are used to refill slots only after all live standbys have been selected, preserving availability when alternatives are scarce.

An address is considered live when it has never been banned or when its ban period has already expired.

Source

pub fn evict_from_rotation(&self, address: &Address)

Drop address from the sticky active set, leaving its ban state untouched; the next selection prefers a random live standby in its place, falling back to evicted members if there are too few standbys.

This is the failover path for callers that disable banning (RequestSettings::ban_failed_address): a failing node yields its slot’s traffic to an available standby even when it is never banned.

Source

pub fn get_live_addresses(&self) -> Vec<Address>

Get all not banned addresses.

Returns a vector of addresses that are not currently banned or whose ban period has expired. The returned addresses use the same filtering logic as Self::get_live_address, checking if the ban period has expired based on the current time.

§Examples
use rs_dapi_client::{AddressList, Address};

let mut list = AddressList::new();
list.add("http://127.0.0.1:3000".parse().unwrap());
list.add("http://127.0.0.1:3001".parse().unwrap());

// Get all non-banned addresses
let live_addresses = list.get_live_addresses();
assert_eq!(live_addresses.len(), 2);
Source

pub fn ban_info(&self) -> Vec<AddressBanInfo>

Get an owned snapshot of every address’ ban state.

Clones the current state into an owned Vec<AddressBanInfo> so it can be inspected without holding the internal lock. The banned flag reflects the currently effectively banned semantics used by AddressList::get_live_address: the address has been banned at least once (ban_count > 0) and its ban period has not yet expired (banned_until is in the future).

Source

pub fn len(&self) -> usize

Get number of all addresses, both banned and not banned.

Source

pub fn is_empty(&self) -> bool

Check if the list is empty. Returns true if there are no addresses in the list. Returns false if there is at least one address in the list. Banned addresses are also counted.

Trait Implementations§

Source§

impl Clone for AddressList

Source§

fn clone(&self) -> AddressList

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 AddressList

Source§

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

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

impl Default for AddressList

Source§

fn default() -> Self

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

impl FromIterator<Address> for AddressList

Source§

fn from_iter<T: IntoIterator<Item = Address>>(iter: T) -> Self

Creates a value from an iterator. Read more
Source§

impl FromStr for AddressList

Source§

type Err = AddressListError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<Self, Self::Err>

Parses a string s to return a value of this type. Read more
Source§

impl IntoIterator for AddressList

Source§

type Item = (Address, AddressStatus)

The type of the elements being iterated over.
Source§

type IntoIter = IntoIter<Address, AddressStatus>

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. 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
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

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

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

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

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

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.

§

impl<T, U> IntoPlatformVersioned<U> for T
where U: FromPlatformVersioned<T>,

§

fn into_platform_versioned(self, platform_version: &PlatformVersion) -> U

Performs the conversion.
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

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

impl<T, U> TryFromVersioned<U> for T
where T: TryFrom<U>,

§

type Error = <T as TryFrom<U>>::Error

The type returned in the event of a conversion error.
§

fn try_from_versioned( value: U, _grove_version: &GroveVersion, ) -> Result<T, <T as TryFromVersioned<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.
§

impl<T, U> TryIntoPlatformVersioned<U> for T
where U: TryFromPlatformVersioned<T>,

§

type Error = <U as TryFromPlatformVersioned<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into_platform_versioned( self, platform_version: &PlatformVersion, ) -> Result<U, <U as TryFromPlatformVersioned<T>>::Error>

Performs the conversion.
§

impl<T, U> TryIntoVersioned<U> for T
where U: TryFromVersioned<T>,

§

type Error = <U as TryFromVersioned<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into_versioned( self, grove_version: &GroveVersion, ) -> Result<U, <U as TryFromVersioned<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more