comparison mercurial/revlog.py @ 51100:8ec2de9c6770

revlog: move the_revisioncache on the inner object The goal for this inner object is to compute that things we cache, it make more sense to have the inner object handle it directly.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 19 Oct 2023 03:33:59 +0200
parents 30f458fc59e9
children be56d322ee89
comparison
equal deleted inserted replaced
51099:30f458fc59e9 51100:8ec2de9c6770
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]