diff options
| author | tv <tv@krebsco.de> | 2026-11-01 13:34:26 +0100 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-11-01 13:34:26 +0100 |
| commit | 1202c0ba9bf49e7e31492c90b37af3e6c91b98b7 (patch) | |
| tree | 72263c64c60c1d99e6e7b4381c032e8d6a4ec990 /src/state | |
| parent | da76a3fd1eeb01b67cf7e281180bd4b677476d48 (diff) | |
state: drop epoch_tx
The stamp is the only lock-free epoch label.
Diffstat (limited to 'src/state')
| -rw-r--r-- | src/state/host.rs | 6 | ||||
| -rw-r--r-- | src/state/mod.rs | 9 |
2 files changed, 7 insertions, 8 deletions
diff --git a/src/state/host.rs b/src/state/host.rs index 6bb9d3b..7c3e165 100644 --- a/src/state/host.rs +++ b/src/state/host.rs @@ -283,10 +283,10 @@ impl Host for AppState { replica.epoch = epoch; replica.epoch_seq += 1; replica.writable = writable; + // Publishes the epoch with the heads (`Replica::stamps`), under the + // same lock, so it never disagrees with the document for anyone + // holding the lock. replica.refresh_heads(); - // Updated under the same lock, so the cached epoch never disagrees - // with the document for anyone holding the lock. - state.epoch_tx.send_replace(epoch); // Reset every peer's sync state before the lock is released, so no // message is generated from or applied to a state that describes the // old document. (Lock order doc -> peer, as in sync generation.) diff --git a/src/state/mod.rs b/src/state/mod.rs index 9ee08b7..5e4a4d3 100644 --- a/src/state/mod.rs +++ b/src/state/mod.rs @@ -59,10 +59,9 @@ pub(crate) struct AppState { /// The document and its epoch. Derefs to `Document`. pub(crate) doc: Arc<DocumentLock>, - /// Copy of `doc.epoch` for cheap, lock-free reads (handshakes, keepalives, /peers). - /// Only ever changed while holding `doc`'s write lock, together with `doc.epoch`. - pub(crate) epoch_tx: watch::Sender<Epoch>, - /// `doc`'s epoch label and heads, readable without its lock (`Replica::stamps`). + /// `doc`'s epoch label and heads, readable without its lock (`Replica::stamps`): + /// for cheap reads (handshakes, keepalives, /peers). Only ever changed while holding + /// `doc`'s write lock, together with `doc.epoch`. pub(crate) stamp: watch::Receiver<Stamp>, pub(crate) lifecycle: Arc<RwLock<NodeLifecycle>>, @@ -231,7 +230,7 @@ impl AppState { /// The local epoch. Code that labels or applies sync messages must use the epoch /// of the locked `Replica` instead, so label and document can't disagree. pub(crate) fn local_epoch(&self) -> Epoch { - *self.epoch_tx.borrow() + self.stamp.borrow().epoch } /// The local epoch and `Replica::epoch_seq`, read together, without waiting for the |
