summaryrefslogtreecommitdiffstats
path: root/src/api
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-10-26 06:11:57 +0100
committertv <tv@krebsco.de>2026-10-26 06:11:57 +0100
commit013bf10824210a6270e4b9d349a22c8afbdadc76 (patch)
tree1722b92b5c82f2fff012e6d90cee8cccb857dd31 /src/api
parentd8738b3a74591587b0efc00edae37e5d46a02d4b (diff)
fix race between alive check and forgetting
Diffstat (limited to 'src/api')
-rw-r--r--src/api/peers.rs9
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");
}