diff --git a/ConflictSet.cpp b/ConflictSet.cpp index ff328d3..a828f0c 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -2494,7 +2494,6 @@ namespace { bool checkRangeRightSide(Node *n, std::span key, int prefixLen, InternalVersionT readVersion, ReadContext *tls) { auto remaining = key; - int searchPathLen = 0; assert(remaining.size() > 0); @@ -2508,7 +2507,7 @@ bool checkRangeRightSide(Node *n, std::span key, int prefixLen, } } - for (;;) { + for (bool first = true;; first = false) { Node *child = getChild(n, remaining[0]); if (child == nullptr) { auto c = getChildGeq(n, remaining[0]); @@ -2516,28 +2515,31 @@ bool checkRangeRightSide(Node *n, std::span key, int prefixLen, n = c; goto downLeftSpine; } else { + if (!first && maxVersion(n) > readVersion) { + return false; + } goto backtrack; } } n = child; remaining = remaining.subspan(1, remaining.size() - 1); - ++searchPathLen; if (n->partialKeyLen > 0) { int commonLen = std::min(n->partialKeyLen, remaining.size()); int i = longestCommonPrefix(n->partialKey(), remaining.data(), commonLen); - searchPathLen += i; if (i < commonLen) { - ++searchPathLen; auto c = n->partialKey()[i] <=> remaining[i]; if (c > 0) { goto downLeftSpine; } else { - if (searchPathLen > prefixLen && n->entryPresent && + if ((!first || i + 1 >= prefixLen) && n->entryPresent && n->entry.rangeVersion > readVersion) { return false; } + if ((!first || i + 1 >= prefixLen) && maxVersion(n) > readVersion) { + return false; + } goto backtrack; } } @@ -2551,13 +2553,10 @@ bool checkRangeRightSide(Node *n, std::span key, int prefixLen, ++tls->range_read_iterations_accum; - assert(searchPathLen <= int(key.size())); - if (remaining.size() == 0) { goto downLeftSpine; } - assert(searchPathLen >= prefixLen); if (n->entryPresent && (n->entry.pointVersion > readVersion || n->entry.rangeVersion > readVersion)) { return false; @@ -2569,21 +2568,14 @@ bool checkRangeRightSide(Node *n, std::span key, int prefixLen, } backtrack: for (;;) { - // searchPathLen > prefixLen implies n is not the root - if (searchPathLen > prefixLen && maxVersion(n) > readVersion) { - return false; - } if (n->parent == nullptr) { return true; } auto next = getChildGeq(n->parent, n->parentsIndex + 1); if (next == nullptr) { - searchPathLen -= 1 + n->partialKeyLen; n = n->parent; } else { - searchPathLen -= n->partialKeyLen; n = next; - searchPathLen += n->partialKeyLen; goto downLeftSpine; } }