From c52d4b5ae43c202569c8801c312c2b56954ff8a0 Mon Sep 17 00:00:00 2001 From: tv Date: Sun, 25 Oct 2026 23:00:56 +0100 Subject: add clock module The Clock module is the system clock that every unix timestamp new goes through. It comes with an offset that only tests can set. --- src/swarm/members.rs | 4 ++-- src/swarm/state_file.rs | 10 +++++++--- src/swarm/sync.rs | 3 ++- 3 files changed, 11 insertions(+), 6 deletions(-) (limited to 'src/swarm') diff --git a/src/swarm/members.rs b/src/swarm/members.rs index 895e0cc..9b0de18 100644 --- a/src/swarm/members.rs +++ b/src/swarm/members.rs @@ -21,7 +21,7 @@ use serde_json::{Value as JsonValue, json}; use tracing::{debug, info, warn}; use crate::document::store::{self, StoreError}; -use crate::state::{AppState, unix_millis}; +use crate::state::AppState; const META_ROOT: &str = "_continuum"; @@ -168,7 +168,7 @@ pub(crate) async fn ensure_registered(state: &AppState) { ) }; let wanted = state.alias.clone(); - let now = unix_millis(); + let now = state.clock.now_millis(); if !registered { let mut entry = json!({ "since": now, "alive": now }); diff --git a/src/swarm/state_file.rs b/src/swarm/state_file.rs index 62a6dbe..8b883fc 100644 --- a/src/swarm/state_file.rs +++ b/src/swarm/state_file.rs @@ -129,7 +129,12 @@ pub(crate) async fn update(state: &AppState, now: bool) { let seeds = { let replica = state.doc.read().await; - seeds(&replica.doc, state.local_id(), state.electorate_window) + seeds( + &replica.doc, + state.local_id(), + state.electorate_window, + state.clock.now_millis(), + ) }; let remembered = Remembered { swarm_id, seeds }; @@ -172,8 +177,7 @@ pub(crate) async fn update(state: &AppState, now: bool) { /// Members to rejoin through: those alive within the electorate window, stable ones /// first, at most `MAX_SEEDS`, sorted. Changes only when members join, leave or change /// tier, so the file rarely does. -fn seeds(doc: &automerge::AutoCommit, me: &str, window: Duration) -> Vec { - let now = crate::state::unix_millis(); +fn seeds(doc: &automerge::AutoCommit, me: &str, window: Duration, now: u64) -> Vec { let (mut stable, transient): (Vec, Vec) = members::electorate(doc, now, window) .into_iter() .filter(|pk| pk != me) diff --git a/src/swarm/sync.rs b/src/swarm/sync.rs index d4503bb..a05e346 100644 --- a/src/swarm/sync.rs +++ b/src/swarm/sync.rs @@ -330,6 +330,7 @@ pub(crate) async fn handle_sync( let epoch = envelope.epoch; let message = envelope.message; let peer = peer.to_owned(); + let clock = Arc::clone(&state.clock); // Some((caught_up, heads changed)) when applied, None when the message belongs // to another epoch. @@ -366,7 +367,7 @@ pub(crate) async fn handle_sync( 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; + let now_ms = clock.now_millis() as i64; // Time 0: not stamped (snapshots, older nodes). let delays: Vec = replica .doc -- cgit v1.3.1