Mercurial > hg-stable
changeset 23287:426d7f901789
revlog: bound based on the length of the compressed deltas
This is only relevant for generaldelta clones.
author | Siddharth Agarwal <sid0@fb.com> |
---|---|
date | Tue, 11 Nov 2014 20:01:19 -0800 |
parents | 40e0067899d4 |
children | 2b9bc7963504 |
files | mercurial/revlog.py |
diffstat | 1 files changed, 11 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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)