Add some comments about safety of calling maxVersion
This commit is contained in:
@@ -1682,7 +1682,8 @@ void mergeWithChild(Node *&self, WriteContext *tls, ConflictSet::Impl *impl,
|
|||||||
child->parentsIndex = self->parentsIndex;
|
child->parentsIndex = self->parentsIndex;
|
||||||
|
|
||||||
// Max versions are stored in the parent, so we need to update it now
|
// Max versions are stored in the parent, so we need to update it now
|
||||||
// that we have a new parent.
|
// that we have a new parent. Safe we call since the root never has a partial
|
||||||
|
// key.
|
||||||
setMaxVersion(child, std::max(childMaxVersion, tls->zero));
|
setMaxVersion(child, std::max(childMaxVersion, tls->zero));
|
||||||
|
|
||||||
self = child;
|
self = child;
|
||||||
@@ -1957,6 +1958,7 @@ bool checkPrefixRead(Node *n, const std::span<const uint8_t> key,
|
|||||||
auto remaining = key;
|
auto remaining = key;
|
||||||
for (;; ++tls->prefix_read_iterations_accum) {
|
for (;; ++tls->prefix_read_iterations_accum) {
|
||||||
if (remaining.size() == 0) {
|
if (remaining.size() == 0) {
|
||||||
|
// There's no way to encode a prefix read of "", so n is not the root
|
||||||
return maxVersion(n) <= readVersion;
|
return maxVersion(n) <= readVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2754,6 +2756,7 @@ struct CheckRangeRightSide {
|
|||||||
|
|
||||||
bool backtrack() {
|
bool backtrack() {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
// searchPathLen > prefixLen implies n is not the root
|
||||||
if (searchPathLen > prefixLen && maxVersion(n) > readVersion) {
|
if (searchPathLen > prefixLen && maxVersion(n) > readVersion) {
|
||||||
ok = false;
|
ok = false;
|
||||||
return true;
|
return true;
|
||||||
@@ -2855,6 +2858,9 @@ bool checkRangeRead(Node *n, std::span<const uint8_t> begin,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This makes it safe to check maxVersion within CheckRangeLeftSide. If this
|
||||||
|
// were false, then we would have returned above since lcp == begin.size().
|
||||||
|
assert(!(n->parent == nullptr && begin.size() == 0));
|
||||||
CheckRangeLeftSide checkRangeLeftSide{n, begin, lcp + 1, readVersion, tls};
|
CheckRangeLeftSide checkRangeLeftSide{n, begin, lcp + 1, readVersion, tls};
|
||||||
CheckRangeRightSide checkRangeRightSide{n, end, lcp + 1, readVersion, tls};
|
CheckRangeRightSide checkRangeRightSide{n, end, lcp + 1, readVersion, tls};
|
||||||
|
|
||||||
@@ -3069,7 +3075,8 @@ void addWriteRange(Node *&root, std::span<const uint8_t> begin,
|
|||||||
beginNode = erase(beginNode, tls, impl, /*logical*/ true, endNode)) {
|
beginNode = erase(beginNode, tls, impl, /*logical*/ true, endNode)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Inserting end trashed endNode's maxVersion. Fix that
|
// Inserting end trashed endNode's maxVersion. Fix that. Safe to call since
|
||||||
|
// the end key always has non-zero size.
|
||||||
fixupMaxVersion(endNode, tls);
|
fixupMaxVersion(endNode, tls);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user