aboutsummaryrefslogtreecommitdiffstats
path: root/src/swarm/peer/keepalive.rs
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-10-31 05:45:57 +0100
committertv <tv@krebsco.de>2026-10-31 05:45:57 +0100
commit964f78a097a76b809954ddd4c1d5c7055d5a5772 (patch)
tree44000aaa4760dafb25a809d00118c59261f23f36 /src/swarm/peer/keepalive.rs
parentf72c751c837a41b807fe09cebe79e78a31309def (diff)
centralize call to topology_change
Diffstat (limited to 'src/swarm/peer/keepalive.rs')
-rw-r--r--src/swarm/peer/keepalive.rs24
1 files changed, 10 insertions, 14 deletions
diff --git a/src/swarm/peer/keepalive.rs b/src/swarm/peer/keepalive.rs
index 40b8ed3..5e03d0e 100644
--- a/src/swarm/peer/keepalive.rs
+++ b/src/swarm/peer/keepalive.rs
@@ -91,11 +91,9 @@ pub(super) async fn heard_from(
let mut peer_state = peer_state.lock().await;
also(&mut peer_state);
let previously_seen = peer_state.last_seen;
- if peer_state.unreachable_since.is_some() {
- // Reachable again (`mark_seen` clears it).
- state.topology_changed.notify_one();
- }
- (peer_state.mark_seen(now), previously_seen)
+ // Reachable (again).
+ let reactivated = topology::change_peer(state, &mut peer_state, |p| p.mark_seen(now));
+ (reactivated, previously_seen)
};
crate::swarm::source::heard_from(state, peer);
if reactivated {
@@ -187,22 +185,20 @@ 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 left = topology::change_peer(state, &mut peer_state, |p| {
+ // A neighbour that only connects out stays one as long as it says so.
+ p.syncs_with_us = Some(remote.syncs_with_you);
+ // Its farewell: dormant now, as if silent for long (a message from it, as
+ // its HELLO when it's back, makes it active again).
+ remote.leaving && p.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 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();
- }
// Off the consumer: telling which heads we lack takes the document's lock.
{
let (state, peer, remote) = (state.clone(), peer.to_owned(), remote.clone());