aboutsummaryrefslogtreecommitdiffstats
path: root/src/swarm/peer
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-11-03 04:44:49 +0100
committertv <tv@krebsco.de>2026-11-03 04:44:49 +0100
commit5581992d5603322d7f02bd76625334be3f8a2b18 (patch)
tree3c904680730e7fa6071b2712746092c67d91e644 /src/swarm/peer
parent05dc2d0373cc8d7b0dc4da63a03a7850e4fefdc8 (diff)
measure 2-hop neighbourhood
Diffstat (limited to 'src/swarm/peer')
-rw-r--r--src/swarm/peer/keepalive.rs13
-rw-r--r--src/swarm/peer/worker.rs1
2 files changed, 11 insertions, 3 deletions
diff --git a/src/swarm/peer/keepalive.rs b/src/swarm/peer/keepalive.rs
index 37fcba8..c04b1ad 100644
--- a/src/swarm/peer/keepalive.rs
+++ b/src/swarm/peer/keepalive.rs
@@ -34,11 +34,14 @@ pub(crate) async fn send_status(state: &AppState, peer: &str) -> Result<()> {
/// 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<()> {
+/// differ (`Status::announcing`). Whom we reach only `with_reaches` (`swarm::reach`):
+/// announcements of heads go often.
+pub(crate) async fn announce_heads(state: &AppState, peer: &str, with_reaches: bool) -> Result<()> {
+ let local = local_status(state, peer).await;
let status = transport::Status {
announcing: true,
- ..local_status(state, peer).await
+ reaches: local.reaches.filter(|_| with_reaches),
+ ..local
};
state
.transport
@@ -192,6 +195,7 @@ pub(crate) async fn local_status(state: &AppState, peer: &str) -> transport::Sta
leaving: state.is_closing(),
announcing: false,
eager,
+ reaches: Some(crate::swarm::reach::published(state)),
}
}
@@ -229,6 +233,9 @@ pub(super) async fn note_status(state: &AppState, peer: &str, remote: &transport
peer_state.reported_heads = remote.heads.heads().map(<[_]>::len);
peer_state.last_heads = Some((remote.epoch, remote.heads.clone()));
peer_state.eager_to = remote.eager;
+ if let Some(reaches) = &remote.reaches {
+ peer_state.reaches = Some((Instant::now(), reaches.clone()));
+ }
drop(peer_state);
if left {
info!(peer = %peer, "Peer said farewell; dormant until it is heard from again");
diff --git a/src/swarm/peer/worker.rs b/src/swarm/peer/worker.rs
index a803922..45e8d8f 100644
--- a/src/swarm/peer/worker.rs
+++ b/src/swarm/peer/worker.rs
@@ -164,6 +164,7 @@ pub(crate) async fn run_peer_worker(state: AppState) {
forget_strangers(&state).await;
crate::swarm::members::ensure_registered(&state).await;
crate::swarm::stability::tick(&state).await;
+ crate::swarm::reach::check(&state).await;
crate::swarm::skew::check(&state).await;
crate::swarm::stats::measure_saved_size(&state);
crate::swarm::source::warn_if_stalled(&state);