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: usizeCurrent 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: usizeCursor used by post-cycle pruning to rotate through stored records when the per-pass prune-confirmation budget is exhausted.
Implementations§
Source§impl NeighborSyncState
impl NeighborSyncState
Sourcepub fn new_cycle(close_neighbors: Vec<PeerId>) -> Self
pub fn new_cycle(close_neighbors: Vec<PeerId>) -> Self
Create a new cycle from the given close neighbors.
Sourcepub fn observe_bootstrap_claim(
&mut self,
peer: PeerId,
now: Instant,
grace_period: Duration,
) -> BootstrapClaimObservation
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.
Sourcepub fn clear_active_bootstrap_claim(&mut self, peer: &PeerId) -> bool
pub fn clear_active_bootstrap_claim(&mut self, peer: &PeerId) -> bool
Clear the active bootstrap claim for a peer, retaining claim history.
Sourcepub fn queue_priority_peers<I>(&mut self, peers: I) -> usizewhere
I: IntoIterator<Item = PeerId>,
pub fn queue_priority_peers<I>(&mut self, peers: I) -> usizewhere
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.
Sourcepub fn retain_sync_peers(&mut self, close_peers: &HashSet<PeerId>) -> usize
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.
Sourcepub fn remove_peer(&mut self, peer: &PeerId) -> bool
pub fn remove_peer(&mut self, peer: &PeerId) -> bool
Remove a peer from any pending neighbor-sync state.
Sourcepub fn is_cycle_complete(&self) -> bool
pub fn is_cycle_complete(&self) -> bool
Whether the current cycle is complete.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for NeighborSyncState
impl RefUnwindSafe for NeighborSyncState
impl Send for NeighborSyncState
impl Sync for NeighborSyncState
impl Unpin for NeighborSyncState
impl UnsafeUnpin for NeighborSyncState
impl UnwindSafe for NeighborSyncState
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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