diff options
| author | tv <tv@krebsco.de> | 2026-11-06 07:04:01 +0100 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-11-06 07:04:01 +0100 |
| commit | 9914413ce61aaa6f6c64d138dd1ae5576d948758 (patch) | |
| tree | f85a7f01839d0a7441c5896b3566b6f861565c21 /src/swarm/peer/forget.rs | |
| parent | 6ee43b664d03752aab3095d020eaa90cf96d7ba0 (diff) | |
unlisted members forgotton
Diffstat (limited to 'src/swarm/peer/forget.rs')
| -rw-r--r-- | src/swarm/peer/forget.rs | 18 |
1 files changed, 12 insertions, 6 deletions
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" ); } |
