diff options
| author | tv <tv@krebsco.de> | 2026-10-26 06:11:57 +0100 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-10-26 06:11:57 +0100 |
| commit | 2828811b0d5f5003b7070bdac7078f50f0783e0f (patch) | |
| tree | b338b1bf04ea17b0d27c64dda11690b3560a11ab /src/api | |
| parent | b75d9cbc37bdc765f4321fc53bf3e1eb53d65700 (diff) | |
fix race between alive check and forgetting
Diffstat (limited to 'src/api')
| -rw-r--r-- | src/api/peers.rs | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/api/peers.rs b/src/api/peers.rs index e22f3cd..eb522b0 100644 --- a/src/api/peers.rs +++ b/src/api/peers.rs @@ -235,7 +235,14 @@ pub(crate) async fn delete_peer( .await .map_err(|e| store_status(e, "Failed to write forget record"))?; - if state.peer_states.write().await.remove(&peer).is_some() { + // Unless forced, a peer that came alive since the check above stays: it cancels + // the record. + let forgotten = if force.allows("alive") { + state.peer_states.write().await.remove(&peer).is_some() + } else { + crate::swarm::peer::forget_unless_alive(&state, &peer, Instant::now()).await + }; + if forgotten { warn!(peer = %peer, "Peer forgotten swarm-wide by operator"); } |
