aboutsummaryrefslogtreecommitdiffstats
path: root/src/swarm/peer/inbound.rs
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-11-03 02:43:15 +0100
committertv <tv@krebsco.de>2026-11-03 02:43:15 +0100
commit5cd26d321b706113afb8431aba35ab8fb32281c4 (patch)
treeae1a64479a29182c44a2375417f74583e4ee074a /src/swarm/peer/inbound.rs
parente4709cc6ab3fca7f7ce40793aa5cceb64f0bfea3 (diff)
announcements answered only if heads differ
Diffstat (limited to 'src/swarm/peer/inbound.rs')
-rw-r--r--src/swarm/peer/inbound.rs9
1 files changed, 8 insertions, 1 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))