aboutsummaryrefslogtreecommitdiffstats
path: root/src/document/sync/model.rs
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-11-08 19:48:45 +0000
committertv <tv@krebsco.de>2026-11-08 20:49:06 +0100
commitb40d3f7ca3f92373eca8dd0683d37183559c78e6 (patch)
tree33431b749f234ed3bf1fdede1a4a5302464d0caf /src/document/sync/model.rs
parent447ba15b16d71fe4c2285c4337aa99fe7b5d9df6 (diff)
document: tell whether a document holds a change without building it
With the policy's reads kept, judging a change still costs about one read (some 3.5 µs), and so does judging without a policy: what is left is At::new, which asks get_change_by_hash for each head. Automerge builds the change again from the document's operations to answer, at a cost growing with its history. Screening asks it again for every candidate and every dependency, and sync for heads. Ask by the missing dependencies instead (changes::holds), which look the hash up: one the document holds is not among them. A change queued in the document, waiting for its dependencies, isn't either; but then some are missing, and only then is it asked the slow way. Every check of whether a document holds a change goes through it.
Diffstat (limited to 'src/document/sync/model.rs')
-rw-r--r--src/document/sync/model.rs2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/document/sync/model.rs b/src/document/sync/model.rs
index ad8c6c3..b3bb703 100644
--- a/src/document/sync/model.rs
+++ b/src/document/sync/model.rs
@@ -170,7 +170,7 @@ fn run(seed: u64, push_below: usize) -> (BTreeMap<String, String>, BTreeMap<Stri
// Behind the peer: pull (`relay::pull_if_behind`).
if heads
.iter()
- .any(|head| side.doc.get_change_by_hash(head).is_none())
+ .any(|head| !crate::document::changes::holds(&side.doc, head))
{
side.session.pull_from(heads);
} else if side.session.reply.is_some() && heads == side.doc.get_heads() {