comparison mercurial/branching/rev_cache.py @ 51904:16efed18ae4e

rev-branch-cache: schedule a write of the "v2" format if we read from "v1" The new file can be memorymapped, while the old one cannot. So there is value in having the v2 format around as soon a possible.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 25 Sep 2024 12:49:32 +0200
parents bd7359c18d69
children bb281ecf4036
comparison
equal deleted inserted replaced
51903:bd7359c18d69 51904:16efed18ae4e
144 assert repo.filtername is None 144 assert repo.filtername is None
145 self._repo = repo 145 self._repo = repo
146 self._names = [] # branch names in local encoding with static index 146 self._names = [] # branch names in local encoding with static index
147 self._rbcrevs = rbcrevs(bytearray()) 147 self._rbcrevs = rbcrevs(bytearray())
148 self._rbcsnameslen = 0 # length of names read at _rbcsnameslen 148 self._rbcsnameslen = 0 # length of names read at _rbcsnameslen
149 self._force_overwrite = False
149 v1_fallback = False 150 v1_fallback = False
150 try: 151 try:
151 try: 152 try:
152 bndata = repo.cachevfs.read(_rbcnames) 153 bndata = repo.cachevfs.read(_rbcnames)
153 except (IOError, OSError): 154 except (IOError, OSError):
155 # using. 156 # using.
156 # 157 #
157 # consider stop doing this many version after hg-6.9 release 158 # consider stop doing this many version after hg-6.9 release
158 bndata = repo.cachevfs.read(_rbc_legacy_names) 159 bndata = repo.cachevfs.read(_rbc_legacy_names)
159 v1_fallback = True 160 v1_fallback = True
161 self._force_overwrite = True
160 self._rbcsnameslen = len(bndata) # for verification before writing 162 self._rbcsnameslen = len(bndata) # for verification before writing
161 if bndata: 163 if bndata:
162 self._names = [ 164 self._names = [
163 encoding.tolocal(bn) for bn in bndata.split(b'\0') 165 encoding.tolocal(bn) for bn in bndata.split(b'\0')
164 ] 166 ]
196 ) 198 )
197 if self._rbcrevslen == 0: 199 if self._rbcrevslen == 0:
198 self._names = [] 200 self._names = []
199 self._rbcnamescount = len(self._names) # number of names read at 201 self._rbcnamescount = len(self._names) # number of names read at
200 # _rbcsnameslen 202 # _rbcsnameslen
201 self._force_overwrite = False
202 203
203 def _clear(self): 204 def _clear(self):
204 self._rbcsnameslen = 0 205 self._rbcsnameslen = 0
205 del self._names[:] 206 del self._names[:]
206 self._rbcnamescount = 0 207 self._rbcnamescount = 0
318 repo = self._repo 319 repo = self._repo
319 wlock = None 320 wlock = None
320 step = b'' 321 step = b''
321 try: 322 try:
322 # write the new names 323 # write the new names
323 if self._rbcnamescount < len(self._names): 324 if self._force_overwrite or self._rbcnamescount < len(self._names):
324 wlock = repo.wlock(wait=False) 325 wlock = repo.wlock(wait=False)
325 step = b' names' 326 step = b' names'
326 self._writenames(repo) 327 self._writenames(repo)
327 328
328 # write the new revs 329 # write the new revs
343 wlock.release() 344 wlock.release()
344 345
345 def _writenames(self, repo): 346 def _writenames(self, repo):
346 """write the new branch names to revbranchcache""" 347 """write the new branch names to revbranchcache"""
347 f = None 348 f = None
349 if self._force_overwrite:
350 self._rbcsnameslen = 0
351 self._rbcnamescount = 0
348 try: 352 try:
349 if self._rbcnamescount != 0: 353 if self._force_overwrite or self._rbcnamescount != 0:
350 f = repo.cachevfs.open(_rbcnames, b'ab') 354 f = repo.cachevfs.open(_rbcnames, b'ab')
351 if f.tell() == self._rbcsnameslen: 355 current_size = f.tell()
356 if current_size == self._rbcsnameslen:
352 f.write(b'\0') 357 f.write(b'\0')
353 else: 358 else:
354 f.close() 359 f.close()
355 f = None 360 if self._force_overwrite:
356 repo.ui.debug(b"%s changed - rewriting it\n" % _rbcnames) 361 dbg = b"resetting content of %s\n"
362 elif current_size > 0:
363 dbg = b"%s changed - rewriting it\n"
364 else:
365 dbg = b"%s is missing - rewriting it\n"
366 repo.ui.debug(dbg % _rbcnames)
357 self._rbcnamescount = 0 367 self._rbcnamescount = 0
358 self._rbcrevslen = 0 368 self._rbcrevslen = 0
359 if self._rbcnamescount == 0: 369 if self._rbcnamescount == 0:
360 # before rewriting names, make sure references are removed 370 # before rewriting names, make sure references are removed
361 repo.cachevfs.unlinkpath(_rbcrevs, ignoremissing=True) 371 repo.cachevfs.unlinkpath(_rbcrevs, ignoremissing=True)