summaryrefslogtreecommitdiffstats
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, 13 insertions, 4 deletions
diff --git a/src/swarm/sync.rs b/src/swarm/sync.rs
index 8f02a4f..0e9da21 100644
--- a/src/swarm/sync.rs
+++ b/src/swarm/sync.rs
@@ -109,11 +109,19 @@ async fn deliver_sync_to_peer(state: &AppState, peer: &str, retry_delivery: bool
let mut peer_state = psm.blocking_lock();
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();
- (
- epoch,
- sync_doc.generate_sync_message(&mut peer_state.sync_state),
- )
+ let message = sync_doc.generate_sync_message(&mut peer_state.sync_state);
+ if message.is_some() {
+ let sent = peer_state
+ .sync_state
+ .sent_hashes
+ .difference(&sent_before)
+ .copied()
+ .collect();
+ peer_state.expect_sync_reply(sent, Instant::now());
+ }
+ (epoch, message)
};
let Some(message) = message else {
return Ok(None);
@@ -290,6 +298,7 @@ pub(crate) async fn handle_sync(
.receive_sync_message(&mut peer_state.sync_state, message)
.context("Automerge synchronization failed")?;
peer_state.last_sync_rx = Some(Instant::now());
+ peer_state.sync_reply_received();
let heads_after = replica.doc.get_heads();
let unproductive = heads_before == heads_after