changeset 39087:f90b333e79cb

revlog: filter out "invalid" delta base candidates There are bases that we know won't produce a good delta chain. For example, if the base is already bigger than twice the size of the text we store, we know the resulting delta chain will never be valid. We might make the check a bit more powerful and generic in the future, but this looks a good start. In particular, empty file (size 0) will never find a good base, so we should stop spending time trying to find one.
author Boris Feld <boris.feld@octobus.net>
date Fri, 27 Jul 2018 12:08:10 +0200
parents 64ddad2f26bb
children ad88726d6982
files mercurial/revlog.py
diffstat 1 files changed, 4 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/revlog.py	Tue Aug 14 13:47:07 2018 -0700
+++ b/mercurial/revlog.py	Fri Jul 27 12:08:10 2018 +0200
@@ -750,7 +750,11 @@
         deltaparent = self.revlog.deltaparent
 
         deltainfo = None
+        deltas_limit = revinfo.textlen * LIMIT_DELTA2TEXT
         for candidaterevs in self._getcandidaterevs(p1, p2, cachedelta):
+            # filter out delta base that will never produce good delta
+            candidaterevs = [r for r in candidaterevs
+                             if self.revlog.length(r) <= deltas_limit]
             nominateddeltas = []
             for candidaterev in candidaterevs:
                 # skip over empty delta (no need to include them in a chain)