Skip to content
Snippets Groups Projects
Commit db0095c83344 authored by Mads Kiilerich's avatar Mads Kiilerich
Browse files

rbc: fix invalid rbc-revs entries caused by missing cache growth

It was in some cases possible to end up writing to the cache file without
growing it first. The range assignment in _setcachedata would append instead of
writing at the requested position and thus write the new record in the wrong
place.

To fix this, we avoid looking up in too small caches, and when growing the
cache, do it right before writing the new record to it so we know it has been
done correctly.
parent b181a650a886
No related branches found
No related tags found
No related merge requests found
......@@ -402,5 +402,5 @@
if rev == nullrev:
return changelog.branchinfo(rev)
# if requested rev is missing, add and populate all missing revs
# if requested rev isn't allocated, grow and cache the rev info
if len(self._rbcrevs) < rbcrevidx + _rbcrecsize:
......@@ -406,6 +406,5 @@
if len(self._rbcrevs) < rbcrevidx + _rbcrecsize:
self._rbcrevs.extend('\0' * (len(changelog) * _rbcrecsize -
len(self._rbcrevs)))
return self._branchinfo(rev)
# fast path: extract data from cache, use it if node is matching
reponode = changelog.node(rev)[:_rbcnodelen]
......@@ -452,6 +451,10 @@
rbcrevidx = rev * _rbcrecsize
rec = array('c')
rec.fromstring(pack(_rbcrecfmt, node, branchidx))
if len(self._rbcrevs) < rbcrevidx + _rbcrecsize:
self._rbcrevs.extend('\0' *
(len(self._repo.changelog) * _rbcrecsize -
len(self._rbcrevs)))
self._rbcrevs[rbcrevidx:rbcrevidx + _rbcrecsize] = rec
self._rbcrevslen = min(self._rbcrevslen, rev)
......
......@@ -655,8 +655,6 @@
$ rm .hg/cache/rbc*
$ hg log -r "5 & branch(5)" -T "{rev}\n"
5
BUG: rbc-revs should have an entry as 5th record but has it misplaced as the
first:
$ f --size --hexdump .hg/cache/rbc-*
.hg/cache/rbc-names-v1: size=1
0000: 61 |a|
......@@ -660,7 +658,13 @@
$ f --size --hexdump .hg/cache/rbc-*
.hg/cache/rbc-names-v1: size=1
0000: 61 |a|
.hg/cache/rbc-revs-v1: size=8
0000: d8 cb c6 1d 00 00 00 00 |........|
.hg/cache/rbc-revs-v1: size=112
0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0020: 00 00 00 00 00 00 00 00 d8 cb c6 1d 00 00 00 00 |................|
0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
$ cd ..
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment