diff options
| author | tv <tv@krebsco.de> | 2026-10-26 04:36:40 +0100 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-10-26 04:36:40 +0100 |
| commit | 4110217d61995d566b17d44860e4ac5a460905ed (patch) | |
| tree | 45c6f534f8eeac1f465271927a12a8793901831d /src | |
| parent | da8340c7c1da0115189afe159f013557461b6a91 (diff) | |
unify keepalive
Diffstat (limited to 'src')
| -rw-r--r-- | src/swarm/peer/inbound.rs | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/src/swarm/peer/inbound.rs b/src/swarm/peer/inbound.rs index e81c71d..040cafb 100644 --- a/src/swarm/peer/inbound.rs +++ b/src/swarm/peer/inbound.rs @@ -119,13 +119,11 @@ pub(crate) async fn handle_message( crate::swarm::source::synced_from(state, &peer); handle_sync(state, &peer, envelope).await?; } + transport::ParsedMessage::Blob(blob) => { + crate::swarm::blob::handle(state, &peer, blob).await; + } transport::ParsedMessage::Ping(remote) => { - if reactivated || peer_swarm(state, &peer).await.is_none() { - ensure_handshake(state, &peer).await; - } - note_keepalive(state, &peer, &remote).await; - let local = local_keepalive(state, &peer).await; - heal_if_diverged(state, &peer, &local, &remote).await; + let local = on_keepalive(state, &peer, &remote, reactivated).await; if let Err(error) = state .transport .send_message(&peer, &ParsedMessage::Pong(local)) @@ -134,19 +132,29 @@ pub(crate) async fn handle_message( debug!(peer = %peer, error = %format!("{error:#}"), "PONG failed"); } } - transport::ParsedMessage::Blob(blob) => { - crate::swarm::blob::handle(state, &peer, blob).await; - } transport::ParsedMessage::Pong(remote) => { + // It answers our PING: a round-trip sample. state.lock_rtt().pong_received(&peer, Instant::now()); - if reactivated || peer_swarm(state, &peer).await.is_none() { - ensure_handshake(state, &peer).await; - } - note_keepalive(state, &peer, &remote).await; - let local = local_keepalive(state, &peer).await; - heal_if_diverged(state, &peer, &local, &remote).await; + on_keepalive(state, &peer, &remote, reactivated).await; } } Ok(()) } + +/// What a PING and a PONG have in common: a handshake if needed, the peer's keepalive +/// noted, and the heal if our documents differ. Returns our keepalive for the peer. +async fn on_keepalive( + state: &AppState, + peer: &str, + remote: &transport::Keepalive, + reactivated: bool, +) -> transport::Keepalive { + if reactivated || peer_swarm(state, peer).await.is_none() { + ensure_handshake(state, peer).await; + } + note_keepalive(state, peer, remote).await; + let local = local_keepalive(state, peer).await; + heal_if_diverged(state, peer, &local, remote).await; + local +} |
