diff options
Diffstat (limited to 'src/swarm/peer')
| -rw-r--r-- | src/swarm/peer/inbound.rs | 9 | ||||
| -rw-r--r-- | src/swarm/peer/keepalive.rs | 15 | ||||
| -rw-r--r-- | src/swarm/peer/mod.rs | 2 |
3 files changed, 24 insertions, 2 deletions
diff --git a/src/swarm/peer/inbound.rs b/src/swarm/peer/inbound.rs index 18d29d5..1454c3e 100644 --- a/src/swarm/peer/inbound.rs +++ b/src/swarm/peer/inbound.rs @@ -143,8 +143,15 @@ pub(crate) async fn handle_message( crate::swarm::blob::handle(state, &peer, blob).await; } transport::ParsedMessage::Status(remote) => { - status_received(state, &peer).await; + // An announcement is no keepalive; it is answered only if our heads differ, + // so the announcer learns what we have that it lacks. + if !remote.announcing { + status_received(state, &peer).await; + } let local = on_status(state, &peer, &remote, reactivated).await; + if remote.announcing && local.heads == remote.heads { + return Ok(()); + } if let Err(error) = state .transport .send_message(&peer, &ParsedMessage::StatusReply(local)) diff --git a/src/swarm/peer/keepalive.rs b/src/swarm/peer/keepalive.rs index 8597dcd..196b8b6 100644 --- a/src/swarm/peer/keepalive.rs +++ b/src/swarm/peer/keepalive.rs @@ -32,6 +32,20 @@ pub(crate) async fn send_status(state: &AppState, peer: &str) -> Result<()> { .await } +/// Sends `peer` a STATUS announcing our new heads (`swarm::relay`): no keepalive, so it +/// leaves the keepalives' schedule as it is, and it is answered only if the peer's heads +/// differ (`Status::announcing`). +pub(crate) async fn announce_heads(state: &AppState, peer: &str) -> Result<()> { + let status = transport::Status { + announcing: true, + ..local_status(state, peer).await + }; + state + .transport + .send_message(peer, &ParsedMessage::Status(status)) + .await +} + /// Sends `peer` a PING (the paths layer measures the path with it). pub(crate) async fn send_ping(state: &AppState, peer: &str) -> Result<()> { let nonce = crate::transport::paths::random_nonce(); @@ -173,6 +187,7 @@ pub(crate) async fn local_status(state: &AppState, peer: &str) -> transport::Sta ready: state.is_ready().await && !state.is_closing(), syncs_with_you, leaving: state.is_closing(), + announcing: false, } } diff --git a/src/swarm/peer/mod.rs b/src/swarm/peer/mod.rs index cf427a2..1826ec6 100644 --- a/src/swarm/peer/mod.rs +++ b/src/swarm/peer/mod.rs @@ -26,6 +26,6 @@ pub(crate) use handshake::{ send_hello_once, }; pub(crate) use inbound::handle_message; -pub(crate) use keepalive::{announce, farewell, send_status}; +pub(crate) use keepalive::{announce, announce_heads, farewell, send_status}; pub(crate) use lanes::SyncLanes; pub(crate) use worker::{Due, run_peer_worker}; |
