From 9914413ce61aaa6f6c64d138dd1ae5576d948758 Mon Sep 17 00:00:00 2001 From: tv Date: Fri, 6 Nov 2026 07:04:01 +0100 Subject: unlisted members forgotton --- src/swarm/peer/forget.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'src/swarm/peer/forget.rs') diff --git a/src/swarm/peer/forget.rs b/src/swarm/peer/forget.rs index 68266d5..ce064a2 100644 --- a/src/swarm/peer/forget.rs +++ b/src/swarm/peer/forget.rs @@ -135,17 +135,23 @@ pub(crate) async fn forget_unless_alive(state: &AppState, pk: &str, now: Instant /// the map of peers would only grow. const STRANGER_KEPT: Duration = Duration::from_secs(24 * 3600); -/// Forgets peers that never became members and were silent for `STRANGER_KEPT`. Only -/// here, not swarm-wide; one that comes back is a stranger again. +/// Forgets peers that never became members and were silent for `STRANGER_KEPT`, and +/// members no longer in the member list as silent (their entry gone without a forget +/// record reaching us: nothing else would ever drop them, and each is probed hourly and +/// copied wherever the peers are walked). A listed member stays however long it is +/// silent: its probe is what finds it when it comes back. Only here, not swarm-wide; +/// one that comes back is a stranger again, and a member once its handshake passes. pub(super) async fn forget_strangers(state: &AppState) { let now = Instant::now(); let mut strangers = Vec::new(); for (peer, peer_state) in state.peers_snapshot().await { let peer_state = peer_state.lock().await; let quiet_since = peer_state.last_seen.unwrap_or(peer_state.added_at); - if !matches!(peer_state.standing, Standing::Member { .. }) - && now.saturating_duration_since(quiet_since) >= STRANGER_KEPT - { + let unlisted = || { + !matches!(peer_state.standing, Standing::Member { .. }) + || crate::swarm::topology::listed(state, &peer) == Some(false) + }; + if now.saturating_duration_since(quiet_since) >= STRANGER_KEPT && unlisted() { strangers.push(peer); } } @@ -158,6 +164,6 @@ pub(super) async fn forget_strangers(state: &AppState) { } info!( forgotten = strangers.len(), - "Forgot peers that never became members and were silent for a day" + "Forgot peers that never became members, or are no longer, and were silent for a day" ); } -- cgit v1.3.1