summaryrefslogtreecommitdiffstats
path: root/src/swarm
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-10-26 06:09:02 +0100
committertv <tv@krebsco.de>2026-10-26 06:09:02 +0100
commitd8738b3a74591587b0efc00edae37e5d46a02d4b (patch)
tree0591869128a78ddd991a7c6d9410bf0e2ce81774 /src/swarm
parent3be4ec3aa0e076e5386cfd1b93b07d12c40a88cb (diff)
forgotten nodes cancel their own records
Diffstat (limited to 'src/swarm')
-rw-r--r--src/swarm/peer/forget.rs29
1 files changed, 14 insertions, 15 deletions
diff --git a/src/swarm/peer/forget.rs b/src/swarm/peer/forget.rs
index df09c3c..ae49a5a 100644
--- a/src/swarm/peer/forget.rs
+++ b/src/swarm/peer/forget.rs
@@ -38,11 +38,11 @@ pub(super) async fn apply_forget_records(state: &AppState) {
}
let now = Instant::now();
- let mut cancel = Vec::new();
+ let mut cancel = false;
for pk in forgotten {
if pk == state.local_id() {
- cancel.push(pk); // we are evidently alive
+ cancel = true; // we are evidently alive
continue;
}
@@ -52,29 +52,28 @@ pub(super) async fn apply_forget_records(state: &AppState) {
let alive = peer_state_mutex.lock().await.is_alive(&state.timing, now);
- if alive {
- cancel.push(pk);
- } else if state.peer_states.write().await.remove(&pk).is_some() {
+ // An alive peer is kept. Only the peer itself cancels its record: it gets the
+ // record from whoever it is alive to, and one cancel is one change instead of
+ // one from every node that hears from it.
+ if !alive && state.peer_states.write().await.remove(&pk).is_some() {
info!(peer = %pk, "Forgetting peer per swarm-wide record");
}
}
- if cancel.is_empty() {
+ if !cancel {
return;
}
- // Individual failures are logged inside; NotFound means another node already
- // cancelled the record.
+ // NotFound: gone since we looked.
+ let local_id = state.local_id().to_owned();
let _ = state
.mutate_doc(move |doc| {
- for pk in &cancel {
- match store::delete_path(&mut *doc, &forgotten_path(pk), false) {
- Ok(()) => info!(peer = %pk, "Peer is alive; cancelling swarm-wide forget"),
- Err(StoreError::NotFound) => {}
- Err(error) => {
- warn!(peer = %pk, error = %error, "Failed to cancel forget record")
- }
+ match store::delete_path(&mut *doc, &forgotten_path(&local_id), false) {
+ Ok(()) => {
+ info!("We were forgotten swarm-wide but are alive; cancelling the record")
}
+ Err(StoreError::NotFound) => {}
+ Err(error) => warn!(error = %error, "Failed to cancel forget record"),
}
Ok::<(), StoreError>(())
})