aboutsummaryrefslogtreecommitdiffstats
path: root/src/swarm/sync.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/swarm/sync.rs')
-rw-r--r--src/swarm/sync.rs17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/swarm/sync.rs b/src/swarm/sync.rs
index b20f7ef..02c6379 100644
--- a/src/swarm/sync.rs
+++ b/src/swarm/sync.rs
@@ -148,6 +148,13 @@ async fn deliver_sync_to_peer(state: &AppState, peer: &str) -> Result<()> {
let replica = doc.blocking_read();
let mut peer_state = psm.blocking_lock();
let (epoch, epoch_seq) = (replica.epoch, replica.epoch_seq);
+ // Whose change it passes on, if any: this message carries it.
+ let writer = peer_state.tree_writer.take();
+ // Along a tree, to a peer that had nothing we lack, with nothing
+ // awaited: taken as delivered (`SyncSession::assume_delivered`).
+ let level = writer.is_some()
+ && peer_state.sync.reply.is_none()
+ && peer_state.sync.have_all_theirs(&replica.doc);
// Under the same locks as the epoch label: the message belongs to
// this document.
let message =
@@ -171,8 +178,9 @@ async fn deliver_sync_to_peer(state: &AppState, peer: &str) -> Result<()> {
);
transport::SyncBody::Delta(spec)
});
- // Whose change it passes on, if any: this message carries it.
- let writer = peer_state.tree_writer.take();
+ if level && matches!(body, Some(transport::SyncBody::Message(_))) {
+ peer_state.sync.assume_delivered(replica.heads());
+ }
(peer_state.sync.id(), epoch, epoch_seq, body, writer)
};
let Some(body) = body else {
@@ -411,6 +419,11 @@ pub(crate) async fn handle_sync(
peer_state.sync.resend_if_needed(&peer);
replica.refresh_heads();
let heads_after = replica.heads().to_vec();
+ if writer.is_some() {
+ // Level with the sender now: it takes the message as delivered, so
+ // there is nothing to answer (`SyncSession::answered_along_tree`).
+ peer_state.sync.answered_along_tree(&heads_after);
+ }
stats.heads_seen(heads_after.len());
let changed = heads_after != heads_before;
// Whose they are, to pass them on along their writers' trees, however they