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