summaryrefslogtreecommitdiffstats
path: root/src/swarm
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-10-23 23:13:58 +0200
committertv <tv@krebsco.de>2026-10-23 23:13:58 +0200
commitf40b729d35bc85cebe43428d2ba37036cc96e36f (patch)
tree3bccd5902535490d46be0ce36143496ae64b3bf4 /src/swarm
parent17012c2f2a380df5bcfe5760fbba68e743a131a6 (diff)
peers that just became ready get syncs
When keepalive says ready and we didn't have taht on record before, the peer is queued for sync. Hello and hello reply don't do this because the handshake already queues a sync.
Diffstat (limited to 'src/swarm')
-rw-r--r--src/swarm/peer.rs9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/swarm/peer.rs b/src/swarm/peer.rs
index 0ef42bf..bc3eaf9 100644
--- a/src/swarm/peer.rs
+++ b/src/swarm/peer.rs
@@ -129,9 +129,18 @@ pub(crate) async fn local_keepalive(state: &AppState, peer: &str) -> transport::
async fn note_keepalive(state: &AppState, peer: &str, remote: &transport::Keepalive) {
if let Some(peer_state) = state.get_peer_state(peer).await {
let mut peer_state = peer_state.lock().await;
+ let became_ready = remote.ready && peer_state.reports_ready != Some(true);
peer_state.reports_ready = Some(remote.ready);
peer_state.syncs_with_us = Some(remote.syncs_with_you);
peer_state.reported_heads = remote.heads.heads().map(<[_]>::len);
+ drop(peer_state);
+ if became_ready {
+ // We may have left the opening to it while it wasn't ready, and nothing else
+ // would make us look again.
+ let _ = state
+ .sync_events
+ .send(SyncEvent::PeerNeedsSync(peer.to_owned()));
+ }
}
crate::swarm::source::reported(state, peer, remote.ready, Some(remote.syncs_with_you));
}