# HG changeset patch # User Boris Feld # Date 2018-12-17 09:46:37 # Node ID ba09db267cb68e54523e64f213d4f1eea50be9ac # Parent 42f59d3f714dd283d6edcc4d72083ce38857f9cb delta: ignore base whose chains already don't match expectations If we know the existing chain does not match our criteria, there is no point to build a delta to append. This is especially useful when dealing with a full text much smaller than its parent. In that case, the parent chain is probably already too large. example affected manifest write before: 1.421005s after: 0.815520s (-42%) diff --git a/mercurial/revlogutils/deltas.py b/mercurial/revlogutils/deltas.py --- a/mercurial/revlogutils/deltas.py +++ b/mercurial/revlogutils/deltas.py @@ -655,6 +655,17 @@ def _candidategroups(revlog, textlen, p1 # no delta for rawtext-changing revs (see "candelta" for why) if revlog.flags(rev) & REVIDX_RAWTEXT_CHANGING_FLAGS: continue + # If we reach here, we are about to build and test a delta. + # The delta building process will compute the chaininfo in all + # case, since that computation is cached, it is fine to access it + # here too. + chainlen, chainsize = revlog._chaininfo(rev) + # if chain will be too long, skip base + if revlog._maxchainlen and chainlen >= revlog._maxchainlen: + continue + # if chain already have too much data, skip base + if deltas_limit < chainsize: + continue group.append(rev) if group: # XXX: in the sparse revlog case, group can become large,