diff options
| author | tv <tv@krebsco.de> | 2026-10-21 14:12:01 +0200 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-10-21 14:12:01 +0200 |
| commit | c9279e4907ceb3cab2abd3ad6e62d011d7d8a1c2 (patch) | |
| tree | 006959c9270ed926f8fb0a98aac5ecae46047eb3 /src/swarm/sync.rs | |
| parent | 5e2bf9b34486b1e1d91a6b2fb6748d506487b915 (diff) | |
resend sync messages that haven't been replied
Diffstat (limited to 'src/swarm/sync.rs')
| -rw-r--r-- | src/swarm/sync.rs | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/swarm/sync.rs b/src/swarm/sync.rs index 115d5c0..04d5b15 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 |
