diff -r 74aea4be8e78 -r 5bb3826bdac4 mercurial/revlog.py --- a/mercurial/revlog.py Sun Nov 17 18:04:28 2013 -0500 +++ b/mercurial/revlog.py Sun Nov 17 18:04:28 2013 -0500 @@ -842,13 +842,17 @@ else: df = self.opener(self.datafile) - readahead = max(65536, length) - df.seek(offset) - d = df.read(readahead) + # Cache data both forward and backward around the requested + # data, in a fixed size window. This helps speed up operations + # involving reading the revlog backwards. + realoffset = offset & ~65535 + reallength = ((offset + length + 65536) & ~65535) - realoffset + df.seek(realoffset) + d = df.read(reallength) df.close() - self._addchunk(offset, d) - if readahead > length: - return util.buffer(d, 0, length) + self._addchunk(realoffset, d) + if offset != realoffset or reallength != length: + return util.buffer(d, offset - realoffset, length) return d def _getchunk(self, offset, length):