840 if self._inline: |
840 if self._inline: |
841 df = self.opener(self.indexfile) |
841 df = self.opener(self.indexfile) |
842 else: |
842 else: |
843 df = self.opener(self.datafile) |
843 df = self.opener(self.datafile) |
844 |
844 |
845 readahead = max(65536, length) |
845 # Cache data both forward and backward around the requested |
846 df.seek(offset) |
846 # data, in a fixed size window. This helps speed up operations |
847 d = df.read(readahead) |
847 # involving reading the revlog backwards. |
|
848 realoffset = offset & ~65535 |
|
849 reallength = ((offset + length + 65536) & ~65535) - realoffset |
|
850 df.seek(realoffset) |
|
851 d = df.read(reallength) |
848 df.close() |
852 df.close() |
849 self._addchunk(offset, d) |
853 self._addchunk(realoffset, d) |
850 if readahead > length: |
854 if offset != realoffset or reallength != length: |
851 return util.buffer(d, 0, length) |
855 return util.buffer(d, offset - realoffset, length) |
852 return d |
856 return d |
853 |
857 |
854 def _getchunk(self, offset, length): |
858 def _getchunk(self, offset, length): |
855 o, d = self._chunkcache |
859 o, d = self._chunkcache |
856 l = len(d) |
860 l = len(d) |