diff options
| author | tv <tv@krebsco.de> | 2026-10-30 20:16:25 +0100 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-10-30 20:16:25 +0100 |
| commit | da94708e6df5c2a2c4b7fce3e67494a19122db9f (patch) | |
| tree | bfdaf79bc5c36d0bb19fd948b771a08cb91c141b /src/swarm | |
| parent | 2e934b7404e8f8fc5b9308e72f275a7b91cb027a (diff) | |
farewell means dormant
Diffstat (limited to 'src/swarm')
| -rw-r--r-- | src/swarm/peer/keepalive.rs | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/swarm/peer/keepalive.rs b/src/swarm/peer/keepalive.rs index afc2b3d..367b1d9 100644 --- a/src/swarm/peer/keepalive.rs +++ b/src/swarm/peer/keepalive.rs @@ -121,6 +121,7 @@ pub(crate) fn announce(state: &AppState) { /// in time: our transport may be gone already. pub(crate) async fn farewell(state: &AppState) { state.stopping.store(true, Ordering::Release); + info!("Saying farewell to our neighbours"); status_to_neighbours(state, Some(FAREWELL_TIMEOUT)).await; } @@ -151,6 +152,7 @@ pub(crate) async fn local_status(state: &AppState, peer: &str) -> transport::Sta epoch_seq, ready: state.is_ready().await && !state.stopping.load(Ordering::Acquire), syncs_with_you, + leaving: state.stopping.load(Ordering::Acquire), } } @@ -169,13 +171,19 @@ pub(super) async fn status_received(state: &AppState, peer: &str) { pub(super) async fn note_status(state: &AppState, peer: &str, remote: &transport::Status) { if let Some(peer_state) = state.get_peer_state(peer).await { let mut peer_state = peer_state.lock().await; + // Its farewell: dormant now, as if silent for long (a message from it, as its + // HELLO when it's back, makes it active again). + let left = remote.leaving && peer_state.say_farewell(Instant::now()); let became_ready = remote.ready && peer_state.reports_ready != Some(true); peer_state.reports_ready = Some(remote.ready); let changed = peer_state.syncs_with_us.replace(remote.syncs_with_you) != Some(remote.syncs_with_you); peer_state.reported_heads = remote.heads.heads().map(<[_]>::len); drop(peer_state); - if changed { + if left { + info!(peer = %peer, "Peer said farewell; dormant until it is heard from again"); + } + if changed || left { // A neighbour that only connects out stays one as long as it says so. state.topology_changed.notify_one(); } |
