diff --git a/server/src/agent_mode.rs b/server/src/agent_mode.rs index d10d19d8..b003c4d4 100644 --- a/server/src/agent_mode.rs +++ b/server/src/agent_mode.rs @@ -295,9 +295,12 @@ fn write_heartbeat(rendezvous_url: &str, port: u16) { return; }; let now = chrono::Utc::now().timestamp() as f64; + let now_ms = chrono::Utc::now().timestamp_millis() as f64; // Advertise our crdt-sync endpoint. let address = format!("ws://0.0.0.0:{port}/crdt-sync"); crdt_state::write_node_presence(&node_id, &address, now, true); + // Write millisecond-precision timestamp via LWW register. + crdt_state::write_node_metadata(&node_id, "", None, now_ms); slog!( "[agent-mode] Heartbeat written: node={:.12}… rendezvous={rendezvous_url}", &node_id @@ -368,8 +371,9 @@ async fn scan_and_claim( .unwrap_or_default() .into_iter() .filter(|n| { - let now = chrono::Utc::now().timestamp() as f64; - n.alive && (now - n.last_seen) < CLAIM_TIMEOUT_SECS + let now_ms = chrono::Utc::now().timestamp_millis() as f64; + let last_ms = n.last_seen_ms.unwrap_or(n.last_seen * 1000.0); + n.alive && (now_ms - last_ms) / 1000.0 < CLAIM_TIMEOUT_SECS }) .map(|n| n.node_id) .collect(); diff --git a/server/src/mesh.rs b/server/src/mesh.rs index 9c8383e5..f7e16d47 100644 --- a/server/src/mesh.rs +++ b/server/src/mesh.rs @@ -70,10 +70,12 @@ impl MeshManager { let alive_peers: Vec<(String, String)> = nodes .into_iter() .filter(|n| { + let now_ms = now * 1000.0; + let last_ms = n.last_seen_ms.unwrap_or(n.last_seen * 1000.0); n.alive && !n.address.is_empty() && n.node_id != self.our_node_id - && (now - n.last_seen) < 600.0 + && (now_ms - last_ms) / 1000.0 < 600.0 && !self.is_rendezvous_peer(&n.address) }) .map(|n| (n.node_id, n.address))