diff options
Diffstat (limited to 'src/swarm/peer.rs')
| -rw-r--r-- | src/swarm/peer.rs | 13 |
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"); |
