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
commitb77f2ce13ec3dc3aff2495b93ca51a3a622bafa8 (patch)
tree58ad108434de62d84db0fe40e6476bf15fe6ec27 /src/swarm
parent487690bb0fb63c5dcc80d009632bd9430d946af1 (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));
}