summaryrefslogtreecommitdiffstats
path: root/src/swarm
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-10-25 23:00:56 +0100
committertv <tv@krebsco.de>2026-10-25 23:00:56 +0100
commitc52d4b5ae43c202569c8801c312c2b56954ff8a0 (patch)
treedac7221b966d9f4fdb8e1b91b1e20bce607de6fc /src/swarm
parent2f7265795b7f6ddf460bf93c5f880fb24bde9d3a (diff)
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.
Diffstat (limited to 'src/swarm')
-rw-r--r--src/swarm/members.rs4
-rw-r--r--src/swarm/state_file.rs10
-rw-r--r--src/swarm/sync.rs3
3 files changed, 11 insertions, 6 deletions
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<String> {
- let now = crate::state::unix_millis();
+fn seeds(doc: &automerge::AutoCommit, me: &str, window: Duration, now: u64) -> Vec<String> {
let (mut stable, transient): (Vec<String>, Vec<String>) = 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<i64> = replica
.doc