Mercurial > hg
changeset 14296:62e25c63fb3a
revlog: fix bug in chainbase cache
The bug didn't cause corruption, and thus wasn't caught in hg verify or in
tests. It could lead to delta chains longer than normally allowed, by
affecting the code that decides when to add a full revision. This could,
in turn, lead to performance regression.
author | Sune Foldager <cryo@cyanite.org> |
---|---|
date | Thu, 12 May 2011 13:47:17 +0200 |
parents | bb7e3b3e6e11 |
children | 2daa5179e73f |
files | mercurial/revlog.py |
diffstat | 1 files changed, 8 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/revlog.py Mon May 09 15:16:56 2011 -0400 +++ b/mercurial/revlog.py Thu May 12 13:47:17 2011 +0200 @@ -218,7 +218,7 @@ self.datafile = indexfile[:-2] + ".d" self.opener = opener self._cache = None - self._basecache = None + self._basecache = (0, 0) self._chunkcache = (0, '') self.index = [] self._pcache = {} @@ -1010,8 +1010,7 @@ delta = mdiff.textdiff(ptext, t) data = compress(delta) l = len(data[1]) + len(data[0]) - basecache = self._basecache - if basecache and basecache[0] == rev: + if basecache[0] == rev: chainbase = basecache[1] else: chainbase = self.chainbase(rev) @@ -1020,14 +1019,15 @@ base = rev else: base = chainbase - return dist, l, data, base + return dist, l, data, base, chainbase curr = len(self) prev = curr - 1 - base = curr + base = chainbase = curr offset = self.end(prev) flags = 0 d = None + basecache = self._basecache p1r, p2r = self.rev(p1), self.rev(p2) # should we try to build a delta? @@ -1036,7 +1036,7 @@ d = builddelta(p1r) else: d = builddelta(prev) - dist, l, data, base = d + dist, l, data, base, chainbase = d # full versions are inserted when the needed deltas # become comparable to the uncompressed text @@ -1049,7 +1049,7 @@ text = buildtext() data = compress(text) l = len(data[1]) + len(data[0]) - base = curr + base = chainbase = curr e = (offset_type(offset, flags), l, textlen, base, link, p1r, p2r, node) @@ -1075,7 +1075,7 @@ if type(text) == str: # only accept immutable objects self._cache = (node, curr, text) - self._basecache = (curr, base) + self._basecache = (curr, chainbase) return node def group(self, nodelist, bundler):