comparison mercurial/branchmap.py @ 51534:4a8bb136ee77

branchcache: allow to detect "pure topological case" for branchmap We don't rum this detection every time we run the branchcache, that would be costly. However we now do it when running `hg debugupdatecache`. This will help existing repository to benefit from the fastpath when possible.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 07 Mar 2024 10:57:16 +0100
parents 718f28ea3af4
children f02ec1ecb3bf
comparison
equal deleted inserted replaced
51533:718f28ea3af4 51534:4a8bb136ee77
67 bcache._filtername, 67 bcache._filtername,
68 repo.filtername, 68 repo.filtername,
69 ) 69 )
70 return bcache 70 return bcache
71 71
72 def update_disk(self, repo): 72 def update_disk(self, repo, detect_pure_topo=False):
73 """ensure and up-to-date cache is (or will be) written on disk 73 """ensure and up-to-date cache is (or will be) written on disk
74 74
75 The cache for this repository view is updated if needed and written on 75 The cache for this repository view is updated if needed and written on
76 disk. 76 disk.
77 77
85 bcache = self._per_filter[repo.filtername] 85 bcache = self._per_filter[repo.filtername]
86 assert bcache._filtername == repo.filtername, ( 86 assert bcache._filtername == repo.filtername, (
87 bcache._filtername, 87 bcache._filtername,
88 repo.filtername, 88 repo.filtername,
89 ) 89 )
90 if detect_pure_topo:
91 bcache._detect_pure_topo(repo)
90 tr = repo.currenttransaction() 92 tr = repo.currenttransaction()
91 if getattr(tr, 'finalized', True): 93 if getattr(tr, 'finalized', True):
92 bcache.sync_disk(repo) 94 bcache.sync_disk(repo)
93 95
94 def updatecache(self, repo): 96 def updatecache(self, repo):
486 raise NotImplementedError 488 raise NotImplementedError
487 489
488 def _ensure_populated(self, repo): 490 def _ensure_populated(self, repo):
489 """make sure any lazily loaded values are fully populated""" 491 """make sure any lazily loaded values are fully populated"""
490 492
493 def _detect_pure_topo(self, repo) -> None:
494 pass
495
491 def validfor(self, repo): 496 def validfor(self, repo):
492 """check that cache contents are valid for (a subset of) this repo 497 """check that cache contents are valid for (a subset of) this repo
493 498
494 - False when the order of changesets changed or if we detect a strip. 499 - False when the order of changesets changed or if we detect a strip.
495 - True when cache is up-to-date for the current repo or its subset.""" 500 - True when cache is up-to-date for the current repo or its subset."""
1053 topo_heads = self._get_topo_heads(repo) 1058 topo_heads = self._get_topo_heads(repo)
1054 heads = [to_node(r) for r in topo_heads] 1059 heads = [to_node(r) for r in topo_heads]
1055 self._entries[self._pure_topo_branch] = heads 1060 self._entries[self._pure_topo_branch] = heads
1056 self._needs_populate = False 1061 self._needs_populate = False
1057 1062
1063 def _detect_pure_topo(self, repo) -> None:
1064 if self._pure_topo_branch is not None:
1065 # we are pure topological already
1066 return
1067 to_node = repo.changelog.node
1068 topo_heads = [to_node(r) for r in self._get_topo_heads(repo)]
1069 if any(n in self._closednodes for n in topo_heads):
1070 return
1071 for branch, heads in self._entries.items():
1072 if heads == topo_heads:
1073 self._pure_topo_branch = branch
1074 break
1075
1058 1076
1059 class remotebranchcache(_BaseBranchCache): 1077 class remotebranchcache(_BaseBranchCache):
1060 """Branchmap info for a remote connection, should not write locally""" 1078 """Branchmap info for a remote connection, should not write locally"""
1061 1079
1062 def __init__( 1080 def __init__(