diff options
Diffstat (limited to 'src/swarm/sync.rs')
| -rw-r--r-- | src/swarm/sync.rs | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/swarm/sync.rs b/src/swarm/sync.rs index 0c7148e..e294201 100644 --- a/src/swarm/sync.rs +++ b/src/swarm/sync.rs @@ -110,9 +110,19 @@ async fn deliver_sync_to_peer(state: &AppState, peer: &str, retry_delivery: bool peer_state.needs_generate = false; let epoch = replica.epoch; let sent_before = peer_state.sync_state.sent_hashes.clone(); - let sync_doc = replica.doc.sync(); - let message = sync_doc.generate_sync_message(&mut peer_state.sync_state); - if message.is_some() { + let message = { + let sync_doc = replica.doc.sync(); + sync_doc.generate_sync_message(&mut peer_state.sync_state) + }; + // A peer whose heads are ours already has everything; Automerge + // answers only when it has something to say, so it will stay + // silent. Waiting for an answer would only end in a pointless + // resend. + let in_step = peer_state.sync_state.their_heads.as_ref() + == Some(&replica.doc.get_heads()); + if in_step { + peer_state.sync_in_step(); + } else if message.is_some() { let sent = peer_state .sync_state .sent_hashes |
