aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-11-06 07:04:01 +0100
committertv <tv@krebsco.de>2026-11-06 07:04:01 +0100
commit9914413ce61aaa6f6c64d138dd1ae5576d948758 (patch)
treef85a7f01839d0a7441c5896b3566b6f861565c21 /src
parent6ee43b664d03752aab3095d020eaa90cf96d7ba0 (diff)
unlisted members forgotton
Diffstat (limited to 'src')
-rw-r--r--src/swarm/peer/forget.rs18
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"
);
}