diff options
| author | tv <tv@krebsco.de> | 2026-11-03 04:44:49 +0100 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-11-03 04:44:49 +0100 |
| commit | 5581992d5603322d7f02bd76625334be3f8a2b18 (patch) | |
| tree | 3c904680730e7fa6071b2712746092c67d91e644 /src/swarm/peer | |
| parent | 05dc2d0373cc8d7b0dc4da63a03a7850e4fefdc8 (diff) | |
measure 2-hop neighbourhood
Diffstat (limited to 'src/swarm/peer')
| -rw-r--r-- | src/swarm/peer/keepalive.rs | 13 | ||||
| -rw-r--r-- | src/swarm/peer/worker.rs | 1 |
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); |
