[PATCH 05 of 10] deltas: skip if projected delta size is bigger than previous snapshot

Pierre-Yves David pierre-yves.david at ens-lyon.org
Thu Jun 13 09:23:00 EDT 2019


# HG changeset patch
# User Valentin Gatien-Baron <vgatien-baron at janestreet.com>
# Date 1556225433 -7200
#      Thu Apr 25 22:50:33 2019 +0200
# Node ID c1659d13be53808661913cfd5b552bbbe4df9f1d
# Parent  614e5f26fcffcd74c601bb51b54bfb2378135f61
# EXP-Topic delta-extra
# Available At https://bitbucket.org/octobus/mercurial-devel/
#              hg pull https://bitbucket.org/octobus/mercurial-devel/ -r c1659d13be53
deltas: skip if projected delta size is bigger than previous snapshot

Before computing any delta, we get a basic estimation of the delta size we can
expect and the resulted compressed value. We then checks this projected size
against the `size(snapshotⁿ) > size(snapshotⁿ⁺¹)` constraint. This allows to
exclude potential base candidates before doing any expensive computation.

This only apply to the intermediate-snapshot case since this constraint only
apply to them.

For some pathological cases of a private repository this step provide a
significant performance boost (timing from `hg perfrevlogwrite`):

before: 14.115908 seconds
after:   3.145906 seconds

diff --git a/mercurial/revlogutils/deltas.py b/mercurial/revlogutils/deltas.py
--- a/mercurial/revlogutils/deltas.py
+++ b/mercurial/revlogutils/deltas.py
@@ -698,6 +698,12 @@ def _candidategroups(revlog, textlen, p1
                         # delta lower bound is larger than accepted upper bound
                         continue
 
+                    # check the relative constraint on the delta size
+                    revlength = revlog.length(rev)
+                    if revlength < lowestrealisticdeltalen:
+                        # delta probable lower bound is larger than target base
+                        continue
+
             group.append(rev)
         if group:
             # XXX: in the sparse revlog case, group can become large,


More information about the Mercurial-devel mailing list