summaryrefslogtreecommitdiffstats
path: root/src/swarm/peer.rs
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-10-25 23:50:29 +0100
committertv <tv@krebsco.de>2026-10-25 23:50:29 +0100
commit0039ffe04d290935936d33e681c2a0f2575c4264 (patch)
tree1bfcaa189bcc5670b1959d766dfdc0e9f5816334 /src/swarm/peer.rs
parenta232ec43702cdd23614737351120fd3b065e987d (diff)
refresh peers after stall
Diffstat (limited to 'src/swarm/peer.rs')
-rw-r--r--src/swarm/peer.rs13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/swarm/peer.rs b/src/swarm/peer.rs
index e8248bf..1240966 100644
--- a/src/swarm/peer.rs
+++ b/src/swarm/peer.rs
@@ -221,6 +221,19 @@ pub(crate) async fn remember_peer(state: &AppState, peer: &str) {
}
}
+/// Starts a new handshake with `peer` even though one is complete: its reply resets
+/// sync on both sides and brings its current peer list (`swarm::source`, after giving
+/// it up as the catch-up source).
+pub(crate) async fn rehandshake(state: &AppState, peer: &str) {
+ if let Some(peer_state) = state.get_peer_state(peer).await {
+ let mut peer_state = peer_state.lock().await;
+ if peer_state.hello_state == HelloState::Established {
+ peer_state.hello_state = HelloState::NotSent;
+ }
+ }
+ ensure_handshake(state, peer).await;
+}
+
pub(crate) async fn send_hello_once(state: &AppState, peer: &str) -> Result<()> {
let Some(peer_state_mutex) = state.get_peer_state(peer).await else {
trace!(peer = %peer, "Peer was forgotten; not sending HELLO");