Skip to main content

NeighborSyncState

Struct NeighborSyncState 

Source
pub struct NeighborSyncState {
    pub priority_order: VecDeque<PeerId>,
    pub order: Vec<PeerId>,
    pub cursor: usize,
    pub last_sync_times: HashMap<PeerId, Instant>,
    pub bootstrap_claims: HashMap<PeerId, Instant>,
    pub bootstrap_claim_history: HashMap<PeerId, Instant>,
    pub prune_cursor: usize,
}
Expand description

Neighbor sync cycle state.

Tracks a deterministic walk through the current close-group snapshot, per-peer cooldown times, active bootstrap claims, and peers that have already used their one bootstrap-claim window.

Fields§

§priority_order: VecDeque<PeerId>

Newly-entered close peers to sync before the normal cycle cursor.

This queue is populated from KClosestPeersChanged routing-table events and is intentionally separate from order: priority syncs do not restart the current round-robin cycle or discard already-scanned peers.

§order: Vec<PeerId>

Deterministic ordering of peers for the current cycle (snapshot).

§cursor: usize

Current cursor position into order.

§last_sync_times: HashMap<PeerId, Instant>

Per-peer last successful sync time (for cooldown).

§bootstrap_claims: HashMap<PeerId, Instant>

Active bootstrap claim first-seen timestamps per peer.

Entries are removed when a peer stops claiming bootstrap. The peer remains in bootstrap_claim_history, so a later claim is repeated-claim abuse instead of a fresh grace period.

§bootstrap_claim_history: HashMap<PeerId, Instant>

First-ever bootstrap claim timestamp per peer.

This is retained after active claims are cleared so each peer gets at most one bootstrap-claim grace window. Under Sybil attack with many distinct peer IDs claiming bootstrap, this map grows unboundedly. In practice the trust engine limits Sybil impact before this becomes a memory issue.

§prune_cursor: usize

Cursor used by post-cycle pruning to rotate through stored records when the per-pass prune-confirmation budget is exhausted.

Implementations§

Source§

impl NeighborSyncState

Source

pub fn new_cycle(close_neighbors: Vec<PeerId>) -> Self

Create a new cycle from the given close neighbors.

Source

pub fn observe_bootstrap_claim( &mut self, peer: PeerId, now: Instant, grace_period: Duration, ) -> BootstrapClaimObservation

Observe a peer claiming bootstrap status.

A peer receives one grace window from its first observed bootstrap claim. If it later stops claiming bootstrap, callers should clear only the active claim with Self::clear_active_bootstrap_claim. A subsequent claim is then reported as BootstrapClaimObservation::Repeated.

Source

pub fn clear_active_bootstrap_claim(&mut self, peer: &PeerId) -> bool

Clear the active bootstrap claim for a peer, retaining claim history.

Source

pub fn queue_priority_peers<I>(&mut self, peers: I) -> usize
where I: IntoIterator<Item = PeerId>,

Queue newly-entered close peers for priority sync.

Existing queued peers are retained in their original position and duplicates from the same routing-table churn burst are ignored.

Source

pub fn retain_sync_peers(&mut self, close_peers: &HashSet<PeerId>) -> usize

Drop pending sync peers that are no longer in the close-peer set.

Peers still in close_peers keep their relative position. The cursor is adjusted so already-scanned retained peers are not selected again.

Source

pub fn remove_peer(&mut self, peer: &PeerId) -> bool

Remove a peer from any pending neighbor-sync state.

Source

pub fn is_cycle_complete(&self) -> bool

Whether the current cycle is complete.

Trait Implementations§

Source§

impl Debug for NeighborSyncState

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> 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> 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> 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, 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