summaryrefslogtreecommitdiffstats
path: root/src/swarm/sync.rs
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-10-24 06:35:11 +0200
committertv <tv@krebsco.de>2026-10-24 06:35:11 +0200
commitc59f213282517e3ab6fb631a7d8e3f9b91a1c5eb (patch)
tree09924d630140527f18ef7ba5b7f60fc28fc8a89b /src/swarm/sync.rs
parent19bc0fbf4e148430064bd040bfe0db25ab137555 (diff)
add propagation stats
Diffstat (limited to 'src/swarm/sync.rs')
-rw-r--r--src/swarm/sync.rs15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/swarm/sync.rs b/src/swarm/sync.rs
index adf8146..09e10f4 100644
--- a/src/swarm/sync.rs
+++ b/src/swarm/sync.rs
@@ -307,6 +307,8 @@ pub(crate) async fn handle_sync(
let peer_state_mutex = Arc::clone(&peer_state_mutex);
let stats = Arc::clone(&state.stats);
let check_caught_up = !state.initial_sync_done.load(Ordering::Acquire);
+ // While catching up, everything arrives late; that says nothing about propagation.
+ let measure_propagation = !check_caught_up;
let epoch = envelope.epoch;
let message = envelope.message;
let peer = peer.to_owned();
@@ -338,6 +340,19 @@ pub(crate) async fn handle_sync(
let heads_after = replica.doc.get_heads();
stats.heads_seen(heads_after.len());
let changed = heads_after != heads_before;
+ if changed && measure_propagation {
+ let now_ms = crate::state::unix_millis() as i64;
+ // Time 0: not stamped (snapshots, older nodes).
+ let delays: Vec<i64> = replica
+ .doc
+ .get_changes(&heads_before)
+ .iter()
+ .map(|change| change.timestamp())
+ .filter(|&time| time > 0)
+ .map(|time| now_ms - time)
+ .collect();
+ stats.propagated(delays);
+ }
Ok(Some((
// Only from a ready peer: a peer still catching up has empty heads, which