diff options
| author | tv <tv@krebsco.de> | 2026-10-23 23:13:58 +0200 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-10-23 23:13:58 +0200 |
| commit | b77f2ce13ec3dc3aff2495b93ca51a3a622bafa8 (patch) | |
| tree | 58ad108434de62d84db0fe40e6476bf15fe6ec27 /src/swarm | |
| parent | 487690bb0fb63c5dcc80d009632bd9430d946af1 (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.rs | 9 |
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)); } |
