# HG changeset patch # User Siddharth Agarwal # Date 1415764879 28800 # Node ID 426d7f901789f6df2087e36a04ccd40ea45a20ae # Parent 40e0067899d471a06e931b33fda7dd27e8a8bacc revlog: bound based on the length of the compressed deltas This is only relevant for generaldelta clones. diff -r 40e0067899d4 -r 426d7f901789 mercurial/revlog.py --- a/mercurial/revlog.py Tue Nov 11 19:54:36 2014 -0800 +++ b/mercurial/revlog.py Tue Nov 11 20:01:19 2014 -0800 @@ -1225,8 +1225,10 @@ base = rev else: base = chainbase - chainlen = self.chainlen(rev) + 1 - return dist, l, data, base, chainbase, chainlen + chainlen, compresseddeltalen = self._chaininfo(rev) + chainlen += 1 + compresseddeltalen += l + return dist, l, data, base, chainbase, chainlen, compresseddeltalen curr = len(self) prev = curr - 1 @@ -1251,7 +1253,7 @@ d = builddelta(prev) else: d = builddelta(prev) - dist, l, data, base, chainbase, chainlen = d + dist, l, data, base, chainbase, chainlen, compresseddeltalen = d # full versions are inserted when the needed deltas # become comparable to the uncompressed text @@ -1260,7 +1262,13 @@ cachedelta[1]) else: textlen = len(text) + + # - 'dist' is the distance from the base revision -- bounding it limits + # the amount of I/O we need to do. + # - 'compresseddeltalen' is the sum of the total size of deltas we need + # to apply -- bounding it limits the amount of CPU we consume. if (d is None or dist > textlen * 2 or l > textlen or + compresseddeltalen > textlen * 2 or (self._maxchainlen and chainlen > self._maxchainlen)): text = buildtext() data = self.compress(text)