aboutsummaryrefslogtreecommitdiffstats
path: root/src/swarm/sync.rs
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-11-08 22:44:23 +0000
committertv <tv@krebsco.de>2026-11-08 23:53:02 +0100
commiteae437ce2734b8d65bf40aa207c134a3c641138f (patch)
tree44743e69511d0f56a987497bcbbc03e53cd4dc74 /src/swarm/sync.rs
parent24527adf52ca2d8d3b927feb1b811e10fc55fc5c (diff)
sync: signatures go with changes only
A sync message took the signatures its peer wasn't sent yet whenever it had a body, an Automerge message saying only what we have included. A signature belongs with the changes it vouches for: they go along the trees, and a peer that got them elsewhere got the signatures with them. Signatures now go in a message that carries changes (pushed, offered as a delta, or in an Automerge message carrying some: SyncSession:: carrying), and in no other.
Diffstat (limited to 'src/swarm/sync.rs')
-rw-r--r--src/swarm/sync.rs14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/swarm/sync.rs b/src/swarm/sync.rs
index 0c49fa3..b7bf8ed 100644
--- a/src/swarm/sync.rs
+++ b/src/swarm/sync.rs
@@ -287,8 +287,18 @@ async fn deliver_sync_to_peer(state: &AppState, peer: &str) -> Result<()> {
_ => {}
}
}
- // With what it carries, the signatures the peer wasn't sent yet.
- let signatures = if body.is_some() {
+ // With changes, the signatures the peer wasn't sent yet: they go where
+ // changes go, along the trees, so a peer that got these changes
+ // elsewhere got the signatures with them, and a message carrying
+ // none takes none.
+ let carries = match &body {
+ Some(
+ transport::SyncBody::Changes { .. } | transport::SyncBody::Delta(_),
+ ) => true,
+ Some(_) => peer_state.sync.carrying(),
+ None => false,
+ };
+ let signatures = if carries {
let (signatures, sent) =
replica.signatures.newer_than(peer_state.signatures_sent);
peer_state.signatures_sent = sent;