Comments
Patch
@@ -358,7 +358,7 @@ class revbranchcache(object):
self._repo = repo
self._names = [] # branch names in local encoding with static index
self._rbcrevs = array('c') # structs of type _rbcrecfmt
- self._rbcsnameslen = 0
+ self._rbcsnameslen = 0 # length of names read at _rbcsnameslen
try:
bndata = repo.vfs.read(_rbcnames)
self._rbcsnameslen = len(bndata) # for verification before writing
@@ -380,7 +380,8 @@ class revbranchcache(object):
len(repo.changelog))
if self._rbcrevslen == 0:
self._names = []
- self._rbcnamescount = len(self._names) # number of good names on disk
+ self._rbcnamescount = len(self._names) # number of names read at
+ # _rbcsnameslen
self._namesreverse = dict((b, r) for r, b in enumerate(self._names))
def _clear(self):
@@ -416,13 +417,17 @@ class revbranchcache(object):
if cachenode == '\0\0\0\0':
pass
elif cachenode == reponode:
- if branchidx < self._rbcnamescount:
+ try:
return self._names[branchidx], close
- # referenced branch doesn't exist - rebuild is expensive but needed
- self._repo.ui.debug("rebuilding corrupted revision branch cache\n")
- self._clear()
+ except IndexError:
+ # recover from invalid reference to unknown branch
+ self._repo.ui.debug("referenced branch names not found"
+ " - rebuilding revision branch cache from scratch\n")
+ self._clear()
else:
# rev/node map has changed, invalidate the cache from here up
+ self._repo.ui.debug("history modification detected - truncating "
+ "revision branch cache to revision %s\n" % rev)
truncate = rbcrevidx + _rbcrecsize
del self._rbcrevs[truncate:]
self._rbcrevslen = min(self._rbcrevslen, truncate)
@@ -632,7 +632,7 @@ situation where the cache is out of sync
cache is rebuilt when corruption is detected
$ echo > .hg/cache/rbc-names-v1
$ hg log -r '5:&branch(.)' -T '{rev} ' --debug
- rebuilding corrupted revision branch cache
+ referenced branch names not found - rebuilding revision branch cache from scratch
8 9 10 11 12 13 truncating cache/rbc-revs-v1 to 40
$ f --size --hexdump .hg/cache/rbc-*
.hg/cache/rbc-names-v1: size=79
@@ -692,7 +692,6 @@ Test for multiple incorrect branch cache
rebuilding corrupted revision branch cache
rebuilding corrupted revision branch cache
truncating cache/rbc-revs-v1 to 8
-BUG: the cache was declared corrupt multiple times and not fully rebuilt:
$ f --size --hexdump .hg/cache/rbc-*
.hg/cache/rbc-names-v1: size=14
0000: 64 65 66 61 75 6c 74 00 62 72 61 6e 63 68 |default.branch|
@@ -302,6 +302,7 @@ Check that the right ancestors is used w
bundle2-input-part: total payload size 1713
bundle2-input-bundle: 0 parts total
invalid branchheads cache (served): tip differs
+ history modification detected - truncating revision branch cache to revision 9
rebase completed
updating the branch cache
truncating cache/rbc-revs-v1 to 72