Mercurial > public > mercurial-scm > hg
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) |