From a68339a2d47982b432ef09485d2a15478ccbeb5f Mon Sep 17 00:00:00 2001 From: tv Date: Wed, 4 Nov 2026 22:25:29 +0100 Subject: fix: level means the peer has our heads --- src/document/sync.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/document/sync.rs b/src/document/sync.rs index 695f272..6eb791e 100644 --- a/src/document/sync.rs +++ b/src/document/sync.rs @@ -389,14 +389,21 @@ impl SyncSession { .iter() .all(|hash| doc.get_change_by_hash(hash).is_some()) }); - let Some(before) = before.filter(|before| older && level(&before.their_heads)) else { + if !before.is_some_and(|before| older && level(&before.their_heads)) { return false; - }; - self.state.their_heads = before.their_heads; - self.state.their_have = before.their_have; - self.state.their_need = before.their_need; - self.state.shared_heads = heads.to_vec(); + } } + // Level: the peer has exactly our heads and needs nothing. Said so outright, not + // as the message's view (or the one before it): a view whose heads we lacked + // names older ones (`known_last_sync`), by which it would seem to lack what came + // since. + self.state.their_heads = Some(heads.to_vec()); + self.state.shared_heads = heads.to_vec(); + self.state.their_have = Some(vec![sync::Have { + last_sync: heads.to_vec(), + bloom: sync::BloomFilter::default(), + }]); + self.state.their_need = Some(Vec::new()); self.state.last_sent_heads = heads.to_vec(); self.state.have_responded = true; true -- cgit v1.3.1