From b9503f8258656f6f5da9b214ce45aa5586fc7188 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Wed, 4 Sep 2024 12:19:53 -0700 Subject: [PATCH] Converting CheckRangeRightSide WIP --- ConflictSet.cpp | 129 ++++++++++++++++++++++++------------------------ 1 file changed, 64 insertions(+), 65 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 260a9d0..ca32d70 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -2627,72 +2627,73 @@ struct CheckRangeRightSide { assert(searchPathLen <= int(key.size())); - if (remaining.size() == 0) { - return downLeftSpine(); - } - - if (searchPathLen >= prefixLen) { - if (n->entryPresent && n->entry.pointVersion > readVersion) { - ok = false; - return true; + for (;; ++tls->range_read_iterations_accum) { + if (remaining.size() == 0) { + goto downLeftSpine; } - if (!checkMaxBetweenExclusive(n, -1, remaining[0], readVersion, tls)) { - ok = false; - return true; - } - } + if (searchPathLen >= prefixLen) { + if (n->entryPresent && n->entry.pointVersion > readVersion) { + ok = false; + return true; + } - if (searchPathLen > prefixLen && n->entryPresent && - n->entry.rangeVersion > readVersion) { - ok = false; - return true; - } - - auto *child = getChild(n, remaining[0]); - if (child == nullptr) { - auto c = getChildGeq(n, remaining[0]); - if (c != nullptr) { - n = c; - return downLeftSpine(); - } else { - return 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) { - return downLeftSpine(); - } else { - if (searchPathLen > prefixLen && n->entryPresent && - n->entry.rangeVersion > readVersion) { - ok = false; - return true; - } - return backtrack(); + if (!checkMaxBetweenExclusive(n, -1, remaining[0], readVersion, tls)) { + ok = false; + return true; } } - if (commonLen == n->partialKeyLen) { - // partial key matches - remaining = remaining.subspan(commonLen, remaining.size() - commonLen); - } else if (n->partialKeyLen > int(remaining.size())) { - return downLeftSpine(); + + if (searchPathLen > prefixLen && n->entryPresent && + n->entry.rangeVersion > readVersion) { + ok = false; + return true; + } + + auto *child = getChild(n, remaining[0]); + if (child == nullptr) { + auto c = getChildGeq(n, remaining[0]); + if (c != nullptr) { + n = c; + goto downLeftSpine; + } else { + 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 && + n->entry.rangeVersion > readVersion) { + ok = false; + return true; + } + goto backtrack; + } + } + if (commonLen == n->partialKeyLen) { + // partial key matches + remaining = + remaining.subspan(commonLen, remaining.size() - commonLen); + } else if (n->partialKeyLen > int(remaining.size())) { + goto downLeftSpine; + } } } - return false; - } - - bool backtrack() { + backtrack: for (;;) { // searchPathLen > prefixLen implies n is not the root if (searchPathLen > prefixLen && maxVersion(n) > readVersion) { @@ -2711,12 +2712,10 @@ struct CheckRangeRightSide { searchPathLen -= n->partialKeyLen; n = next; searchPathLen += n->partialKeyLen; - return downLeftSpine(); + goto downLeftSpine; } } - } - - bool downLeftSpine() { + downLeftSpine: for (; !n->entryPresent; n = getFirstChildExists(n)) { } ok = n->entry.rangeVersion <= readVersion; @@ -2786,7 +2785,7 @@ bool checkRangeRead(Node *n, std::span begin, if (lcp == int(begin.size())) { CheckRangeRightSide checkRangeRightSide{n, end, lcp, readVersion, tls}; - for (; !checkRangeRightSide.step(); ++tls->range_read_iterations_accum) + for (; !checkRangeRightSide.step();) ; return checkRangeRightSide.ok; } @@ -2801,7 +2800,7 @@ bool checkRangeRead(Node *n, std::span begin, assert(!(n->parent == nullptr && begin.size() == 0)); bool lhsOk = checkRangeLeftSide(n, begin, lcp + 1, readVersion, tls); CheckRangeRightSide checkRangeRightSide{n, end, lcp + 1, readVersion, tls}; - for (; !checkRangeRightSide.step(); ++tls->range_read_iterations_accum) + for (; !checkRangeRightSide.step();) ; return lhsOk && checkRangeRightSide.ok;