aboutsummaryrefslogtreecommitdiffstats
path: root/src/swarm/peer/keepalive.rs
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-10-30 20:16:25 +0100
committertv <tv@krebsco.de>2026-10-30 20:16:25 +0100
commitda94708e6df5c2a2c4b7fce3e67494a19122db9f (patch)
treebfdaf79bc5c36d0bb19fd948b771a08cb91c141b /src/swarm/peer/keepalive.rs
parent2e934b7404e8f8fc5b9308e72f275a7b91cb027a (diff)
farewell means dormant
Diffstat (limited to 'src/swarm/peer/keepalive.rs')
-rw-r--r--src/swarm/peer/keepalive.rs10
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();
}