aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-11-04 22:25:29 +0100
committertv <tv@krebsco.de>2026-11-04 22:25:29 +0100
commita68339a2d47982b432ef09485d2a15478ccbeb5f (patch)
tree0b428bb5909c2e14d470132ac06ade427de29966
parentd587a8e7cdc0bb6ff45a413ef183ec58b3052308 (diff)
fix: level means the peer has our heads
-rw-r--r--src/document/sync.rs19
1 files 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