mercurial/revlog.py
changeset 20180 969148b49fc6
parent 20179 5bb3826bdac4
child 20217 33394f2e331e
equal deleted inserted replaced
20179:5bb3826bdac4 20180:969148b49fc6
   200         self.datafile = indexfile[:-2] + ".d"
   200         self.datafile = indexfile[:-2] + ".d"
   201         self.opener = opener
   201         self.opener = opener
   202         self._cache = None
   202         self._cache = None
   203         self._basecache = None
   203         self._basecache = None
   204         self._chunkcache = (0, '')
   204         self._chunkcache = (0, '')
       
   205         self._chunkcachesize = 65536
   205         self.index = []
   206         self.index = []
   206         self._pcache = {}
   207         self._pcache = {}
   207         self._nodecache = {nullid: nullrev}
   208         self._nodecache = {nullid: nullrev}
   208         self._nodepos = None
   209         self._nodepos = None
   209 
   210 
   213             if 'revlogv1' in opts:
   214             if 'revlogv1' in opts:
   214                 if 'generaldelta' in opts:
   215                 if 'generaldelta' in opts:
   215                     v |= REVLOGGENERALDELTA
   216                     v |= REVLOGGENERALDELTA
   216             else:
   217             else:
   217                 v = 0
   218                 v = 0
       
   219             if 'chunkcachesize' in opts:
       
   220                 self._chunkcachesize = opts['chunkcachesize']
       
   221 
       
   222         if self._chunkcachesize <= 0:
       
   223             raise RevlogError(_('revlog chunk cache size %r is not greater '
       
   224                                 'than 0') % self._chunkcachesize)
       
   225         elif self._chunkcachesize & (self._chunkcachesize - 1):
       
   226             raise RevlogError(_('revlog chunk cache size %r is not a power '
       
   227                                 'of 2') % self._chunkcachesize)
   218 
   228 
   219         i = ''
   229         i = ''
   220         self._initempty = True
   230         self._initempty = True
   221         try:
   231         try:
   222             f = self.opener(self.indexfile)
   232             f = self.opener(self.indexfile)
   843             df = self.opener(self.datafile)
   853             df = self.opener(self.datafile)
   844 
   854 
   845         # Cache data both forward and backward around the requested
   855         # Cache data both forward and backward around the requested
   846         # data, in a fixed size window. This helps speed up operations
   856         # data, in a fixed size window. This helps speed up operations
   847         # involving reading the revlog backwards.
   857         # involving reading the revlog backwards.
   848         realoffset = offset & ~65535
   858         cachesize = self._chunkcachesize
   849         reallength = ((offset + length + 65536) & ~65535) - realoffset
   859         realoffset = offset & ~(cachesize - 1)
       
   860         reallength = (((offset + length + cachesize) & ~(cachesize - 1))
       
   861                       - realoffset)
   850         df.seek(realoffset)
   862         df.seek(realoffset)
   851         d = df.read(reallength)
   863         d = df.read(reallength)
   852         df.close()
   864         df.close()
   853         self._addchunk(realoffset, d)
   865         self._addchunk(realoffset, d)
   854         if offset != realoffset or reallength != length:
   866         if offset != realoffset or reallength != length: