388 self.data_config.chunk_cache_size, |
388 self.data_config.chunk_cache_size, |
389 ) |
389 ) |
390 |
390 |
391 # revlog header -> revlog compressor |
391 # revlog header -> revlog compressor |
392 self._decompressors = {} |
392 self._decompressors = {} |
|
393 # 3-tuple of (node, rev, text) for a raw revision. |
|
394 self._revisioncache = None |
393 |
395 |
394 @property |
396 @property |
395 def index_file(self): |
397 def index_file(self): |
396 return self.__index_file |
398 return self.__index_file |
397 |
399 |
1021 self.delta_config = self.opener.options[b'delta-config'].copy() |
1023 self.delta_config = self.opener.options[b'delta-config'].copy() |
1022 else: |
1024 else: |
1023 self.delta_config = DeltaConfig() |
1025 self.delta_config = DeltaConfig() |
1024 self.delta_config.upper_bound_comp = upperboundcomp |
1026 self.delta_config.upper_bound_comp = upperboundcomp |
1025 |
1027 |
1026 # 3-tuple of (node, rev, text) for a raw revision. |
|
1027 self._revisioncache = None |
|
1028 # Maps rev to chain base rev. |
1028 # Maps rev to chain base rev. |
1029 self._chainbasecache = util.lrucachedict(100) |
1029 self._chainbasecache = util.lrucachedict(100) |
1030 |
1030 |
1031 self.index = None |
1031 self.index = None |
1032 self._docket = None |
1032 self._docket = None |
1663 else: |
1663 else: |
1664 nodemaputil.setup_persistent_nodemap(transaction, self) |
1664 nodemaputil.setup_persistent_nodemap(transaction, self) |
1665 |
1665 |
1666 def clearcaches(self): |
1666 def clearcaches(self): |
1667 """Clear in-memory caches""" |
1667 """Clear in-memory caches""" |
1668 self._revisioncache = None |
1668 self._inner._revisioncache = None |
1669 self._chainbasecache.clear() |
1669 self._chainbasecache.clear() |
1670 self._inner._segmentfile.clear_cache() |
1670 self._inner._segmentfile.clear_cache() |
1671 self._inner._segmentfile_sidedata.clear_cache() |
1671 self._inner._segmentfile_sidedata.clear_cache() |
1672 self._pcache = {} |
1672 self._pcache = {} |
1673 self._nodemap_docket = None |
1673 self._nodemap_docket = None |
2569 r = flagutil.processflagsread(self, rawtext, flags) |
2569 r = flagutil.processflagsread(self, rawtext, flags) |
2570 text, validatehash = r |
2570 text, validatehash = r |
2571 if validatehash: |
2571 if validatehash: |
2572 self.checkhash(text, node, rev=rev) |
2572 self.checkhash(text, node, rev=rev) |
2573 if not validated: |
2573 if not validated: |
2574 self._revisioncache = (node, rev, rawtext) |
2574 self._inner._revisioncache = (node, rev, rawtext) |
2575 |
2575 |
2576 return text |
2576 return text |
2577 |
2577 |
2578 def _rawtext(self, node, rev): |
2578 def _rawtext(self, node, rev): |
2579 """return the possibly unvalidated rawtext for a revision |
2579 """return the possibly unvalidated rawtext for a revision |
2586 # An intermediate text to apply deltas to |
2586 # An intermediate text to apply deltas to |
2587 basetext = None |
2587 basetext = None |
2588 |
2588 |
2589 # Check if we have the entry in cache |
2589 # Check if we have the entry in cache |
2590 # The cache entry looks like (node, rev, rawtext) |
2590 # The cache entry looks like (node, rev, rawtext) |
2591 if self._revisioncache: |
2591 if self._inner._revisioncache: |
2592 if self._revisioncache[0] == node: |
2592 if self._inner._revisioncache[0] == node: |
2593 return (rev, self._revisioncache[2], True) |
2593 return (rev, self._inner._revisioncache[2], True) |
2594 cachedrev = self._revisioncache[1] |
2594 cachedrev = self._inner._revisioncache[1] |
2595 |
2595 |
2596 if rev is None: |
2596 if rev is None: |
2597 rev = self.rev(node) |
2597 rev = self.rev(node) |
2598 |
2598 |
2599 chain, stopped = self._inner._deltachain(rev, stoprev=cachedrev) |
2599 chain, stopped = self._inner._deltachain(rev, stoprev=cachedrev) |
2600 if stopped: |
2600 if stopped: |
2601 basetext = self._revisioncache[2] |
2601 basetext = self._inner._revisioncache[2] |
2602 |
2602 |
2603 # drop cache to save memory, the caller is expected to |
2603 # drop cache to save memory, the caller is expected to |
2604 # update self._revisioncache after validating the text |
2604 # update self._inner._revisioncache after validating the text |
2605 self._revisioncache = None |
2605 self._inner._revisioncache = None |
2606 |
2606 |
2607 targetsize = None |
2607 targetsize = None |
2608 rawsize = self.index[rev][2] |
2608 rawsize = self.index[rev][2] |
2609 if 0 <= rawsize: |
2609 if 0 <= rawsize: |
2610 targetsize = 4 * rawsize |
2610 targetsize = 4 * rawsize |
2682 # only stores the raw revision and clearing the cache does have |
2682 # only stores the raw revision and clearing the cache does have |
2683 # the side-effect that we won't have a cache hit when the raw |
2683 # the side-effect that we won't have a cache hit when the raw |
2684 # revision data is accessed. But this case should be rare and |
2684 # revision data is accessed. But this case should be rare and |
2685 # it is extra work to teach the cache about the hash |
2685 # it is extra work to teach the cache about the hash |
2686 # verification state. |
2686 # verification state. |
2687 if self._revisioncache and self._revisioncache[0] == node: |
2687 if ( |
2688 self._revisioncache = None |
2688 self._inner._revisioncache |
|
2689 and self._inner._revisioncache[0] == node |
|
2690 ): |
|
2691 self._inner._revisioncache = None |
2689 |
2692 |
2690 revornode = rev |
2693 revornode = rev |
2691 if revornode is None: |
2694 if revornode is None: |
2692 revornode = templatefilters.short(hex(node)) |
2695 revornode = templatefilters.short(hex(node)) |
2693 raise error.RevlogError( |
2696 raise error.RevlogError( |
3147 |
3150 |
3148 if alwayscache and rawtext is None: |
3151 if alwayscache and rawtext is None: |
3149 rawtext = deltacomputer.buildtext(revinfo) |
3152 rawtext = deltacomputer.buildtext(revinfo) |
3150 |
3153 |
3151 if type(rawtext) == bytes: # only accept immutable objects |
3154 if type(rawtext) == bytes: # only accept immutable objects |
3152 self._revisioncache = (node, curr, rawtext) |
3155 self._inner._revisioncache = (node, curr, rawtext) |
3153 self._chainbasecache[curr] = deltainfo.chainbase |
3156 self._chainbasecache[curr] = deltainfo.chainbase |
3154 return curr |
3157 return curr |
3155 |
3158 |
3156 def _get_data_offset(self, prev): |
3159 def _get_data_offset(self, prev): |
3157 """Returns the current offset in the (in-transaction) data file. |
3160 """Returns the current offset in the (in-transaction) data file. |
3430 self._docket.data_end = data_end |
3433 self._docket.data_end = data_end |
3431 self._docket.sidedata_end = sidedata_end |
3434 self._docket.sidedata_end = sidedata_end |
3432 self._docket.write(transaction, stripping=True) |
3435 self._docket.write(transaction, stripping=True) |
3433 |
3436 |
3434 # then reset internal state in memory to forget those revisions |
3437 # then reset internal state in memory to forget those revisions |
3435 self._revisioncache = None |
3438 self._inner._revisioncache = None |
3436 self._chaininfocache = util.lrucachedict(500) |
3439 self._chaininfocache = util.lrucachedict(500) |
3437 self._inner._segmentfile.clear_cache() |
3440 self._inner._segmentfile.clear_cache() |
3438 self._inner._segmentfile_sidedata.clear_cache() |
3441 self._inner._segmentfile_sidedata.clear_cache() |
3439 |
3442 |
3440 del self.index[rev:-1] |
3443 del self.index[rev:-1] |