diff options
Diffstat (limited to 'src/swarm/sync.rs')
| -rw-r--r-- | src/swarm/sync.rs | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/src/swarm/sync.rs b/src/swarm/sync.rs index 28f3ca0..394e589 100644 --- a/src/swarm/sync.rs +++ b/src/swarm/sync.rs @@ -239,14 +239,16 @@ async fn deliver_sync_to_peer(state: &AppState, peer: &str) -> Result<()> { return (session, Ok(None)); }; // What the envelope adds to an Automerge message (`swarm::stats`), and of - // that, the epoch (msgpack: 36 bytes). + // that, the epoch's tag (msgpack: 12 bytes, up to 20 for generations past + // 127). let inner = match &body { transport::SyncBody::Message(payload) => Some(payload.0.len()), transport::SyncBody::Delta(_) => None, }; - let ids = 36; + let ids = rmp_serde::encode::to_vec(&transport::EpochTag::of(epoch)) + .map_or(0, |tag| tag.len()); let envelope = transport::SyncEnvelope { - epoch, + epoch: transport::EpochTag::of(epoch), epoch_seq, body, ready, @@ -406,14 +408,20 @@ pub(crate) async fn handle_sync( return Ok(()); } - let epoch_label = envelope.epoch; + // The tag names our epoch, or the message is of no epoch we sync on (the sender + // switched meanwhile, or we did). + let Some(epoch) = envelope.epoch.resolve([state.local_epoch()]) else { + debug!(peer = %peer, epoch = %envelope.epoch, "Dropped sync message from another epoch"); + return Ok(()); + }; + let epoch_label = epoch; let from_ready = envelope.ready; let writer = envelope.writer; let delivered = envelope.delivered; let payload = match envelope.body { transport::SyncBody::Message(payload) => payload, transport::SyncBody::Delta(spec) => { - fetch_delta(state, peer, envelope.epoch, spec); + fetch_delta(state, peer, epoch, spec); return Ok(()); } }; @@ -435,7 +443,6 @@ pub(crate) async fn handle_sync( 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 = payload; let peer = peer.to_owned(); let clock = Arc::clone(&state.clock); |
