mercurial/revlog.py
changeset 20179 5bb3826bdac4
parent 20074 5fc2ae1c631b
child 20180 969148b49fc6
equal deleted inserted replaced
20178:74aea4be8e78 20179:5bb3826bdac4
   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)