comparison mercurial/branchmap.py @ 28558:bcd106d456c4

cache: rebuild branch cache from scratch when inconsistencies are detected This should recover automatically from some corruptions that for unknown reasons are seen in the wild.
author Mads Kiilerich <madski@unity3d.com>
date Sun, 13 Mar 2016 02:06:23 +0100
parents 4b83507bfc91
children d2c6f3a948fa
comparison
equal deleted inserted replaced
28557:4b83507bfc91 28558:bcd106d456c4
381 if self._rbcrevslen == 0: 381 if self._rbcrevslen == 0:
382 self._names = [] 382 self._names = []
383 self._rbcnamescount = len(self._names) # number of good names on disk 383 self._rbcnamescount = len(self._names) # number of good names on disk
384 self._namesreverse = dict((b, r) for r, b in enumerate(self._names)) 384 self._namesreverse = dict((b, r) for r, b in enumerate(self._names))
385 385
386 def _clear(self):
387 self._rbcsnameslen = 0
388 del self._names[:]
389 self._rbcnamescount = 0
390 self._namesreverse.clear()
391 self._rbcrevslen = len(self._repo.changelog)
392 self._rbcrevs = array('c')
393 self._rbcrevs.fromstring('\0' * (self._rbcrevslen * _rbcrecsize))
394
386 def branchinfo(self, rev): 395 def branchinfo(self, rev):
387 """Return branch name and close flag for rev, using and updating 396 """Return branch name and close flag for rev, using and updating
388 persistent cache.""" 397 persistent cache."""
389 changelog = self._repo.changelog 398 changelog = self._repo.changelog
390 rbcrevidx = rev * _rbcrecsize 399 rbcrevidx = rev * _rbcrecsize
406 if close: 415 if close:
407 branchidx &= _rbcbranchidxmask 416 branchidx &= _rbcbranchidxmask
408 if cachenode == '\0\0\0\0': 417 if cachenode == '\0\0\0\0':
409 pass 418 pass
410 elif cachenode == reponode: 419 elif cachenode == reponode:
411 return self._names[branchidx], close 420 if branchidx < self._rbcnamescount:
421 return self._names[branchidx], close
422 # referenced branch doesn't exist - rebuild is expensive but needed
423 self._repo.ui.debug("rebuilding corrupted revision branch cache\n")
424 self._clear()
412 else: 425 else:
413 # rev/node map has changed, invalidate the cache from here up 426 # rev/node map has changed, invalidate the cache from here up
414 truncate = rbcrevidx + _rbcrecsize 427 truncate = rbcrevidx + _rbcrecsize
415 del self._rbcrevs[truncate:] 428 del self._rbcrevs[truncate:]
416 self._rbcrevslen = min(self._rbcrevslen, truncate) 429 self._rbcrevslen = min(self._rbcrevslen, truncate)