summaryrefslogtreecommitdiffstats
path: root/src/swarm/peer.rs
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-10-23 22:21:15 +0200
committertv <tv@krebsco.de>2026-10-23 22:22:43 +0200
commitd8f0933b5c88634ee7e83b435241084baa6abf5b (patch)
treea7296a95493ad9a06d98588d67a7e3112b681e19 /src/swarm/peer.rs
parent276f936fc8730504666fbf1c3c5b2942f9be9016 (diff)
probe sync source during catch-up
This allows changing sources without the fixed 30 s stall duration.
Diffstat (limited to 'src/swarm/peer.rs')
-rw-r--r--src/swarm/peer.rs8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/swarm/peer.rs b/src/swarm/peer.rs
index f98bf17..9fe9b07 100644
--- a/src/swarm/peer.rs
+++ b/src/swarm/peer.rs
@@ -132,6 +132,7 @@ async fn note_keepalive(state: &AppState, peer: &str, remote: &transport::Keepal
peer_state.reports_ready = Some(remote.ready);
peer_state.syncs_with_us = Some(remote.syncs_with_you);
}
+ crate::swarm::source::reported(state, peer, remote.ready, Some(remote.syncs_with_you));
}
async fn heal_if_diverged(
@@ -442,7 +443,9 @@ pub(crate) async fn run_peer_worker(state: AppState) {
);
}
- if ping_due {
+ let probe_due =
+ !ping_due && crate::swarm::source::probe_due(&state, peer, Instant::now());
+ if ping_due || probe_due {
let local = local_keepalive(&state, peer).await;
if let Err(error) = state
.transport
@@ -552,6 +555,8 @@ async fn observe_peer_epoch(state: &AppState, peer: &str, remote: Epoch) -> bool
// (resetting both sides again) while this fresh sync is under way.
peer_state.reset_sync(SessionCause::PeerEpochChanged);
peer_state.last_sync_rx = Some(Instant::now());
+ // Whether it would sync with us was said about its old epoch.
+ peer_state.syncs_with_us = None;
}
previous
};
@@ -685,6 +690,7 @@ pub(crate) async fn handle_message(
.lock()
.await
.mark_seen(Instant::now());
+ crate::swarm::source::heard_from(state, &peer);
if reactivated {
info!(peer = %peer, "Dormant peer is active again; re-handshaking");