From 8a4b370e2ac86e050f97982b1d14c36337325915 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Wed, 4 Sep 2024 12:04:58 -0700 Subject: [PATCH] Make CheckRange{Left,Right}Side into normal functions, WIP --- ConflictSet.cpp | 152 +++++++++++++++++++++--------------------------- 1 file changed, 67 insertions(+), 85 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 7e35b57..5a5ff20 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -2532,58 +2532,29 @@ struct CheckRangeLeftSide { bool ok; bool step() { - if (remaining.size() == 0) { - assert(searchPathLen >= prefixLen); - ok = maxVersion(n) <= readVersion; - return true; - } - - if (searchPathLen >= prefixLen) { - if (!checkMaxBetweenExclusive(n, remaining[0], 256, readVersion, tls)) { - ok = false; - return true; - } - } - - auto [child, maxV] = getChildAndMaxVersion(n, remaining[0]); - if (child == nullptr) { - auto c = getChildGeq(n, remaining[0]); - if (c != nullptr) { - if (searchPathLen < prefixLen) { - n = c; - return downLeftSpine(); - } - n = c; + for (;; ++tls->range_read_iterations_accum) { + if (remaining.size() == 0) { + assert(searchPathLen >= prefixLen); ok = maxVersion(n) <= readVersion; return true; - } else { - n = nextSibling(n); - if (n == nullptr) { - ok = true; + } + + if (searchPathLen >= prefixLen) { + if (!checkMaxBetweenExclusive(n, remaining[0], 256, readVersion, tls)) { + ok = false; return true; } - return downLeftSpine(); } - } - 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) { - auto c = n->partialKey()[i] <=> remaining[i]; - if (c > 0) { + auto [child, maxV] = getChildAndMaxVersion(n, remaining[0]); + if (child == nullptr) { + auto c = getChildGeq(n, remaining[0]); + if (c != nullptr) { if (searchPathLen < prefixLen) { - return downLeftSpine(); - } - if (n->entryPresent && n->entry.rangeVersion > readVersion) { - ok = false; - return true; + n = c; + goto downLeftSpine; } + n = c; ok = maxVersion(n) <= readVersion; return true; } else { @@ -2592,30 +2563,60 @@ struct CheckRangeLeftSide { ok = true; return true; } - return downLeftSpine(); + goto downLeftSpine; } } - if (commonLen == n->partialKeyLen) { - // partial key matches - remaining = remaining.subspan(commonLen, remaining.size() - commonLen); - } else if (n->partialKeyLen > int(remaining.size())) { - assert(searchPathLen >= prefixLen); - if (n->entryPresent && n->entry.rangeVersion > readVersion) { - ok = false; + + 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) { + auto c = n->partialKey()[i] <=> remaining[i]; + if (c > 0) { + if (searchPathLen < prefixLen) { + goto downLeftSpine; + } + if (n->entryPresent && n->entry.rangeVersion > readVersion) { + ok = false; + return true; + } + ok = maxVersion(n) <= readVersion; + return true; + } else { + n = nextSibling(n); + if (n == nullptr) { + ok = true; + return true; + } + goto downLeftSpine; + } + } + if (commonLen == n->partialKeyLen) { + // partial key matches + remaining = + remaining.subspan(commonLen, remaining.size() - commonLen); + } else if (n->partialKeyLen > int(remaining.size())) { + assert(searchPathLen >= prefixLen); + if (n->entryPresent && n->entry.rangeVersion > readVersion) { + ok = false; + return true; + } + ok = maxVersion(n) <= readVersion; return true; } - ok = maxVersion(n) <= readVersion; + } + if (maxV <= readVersion) { + ok = true; return true; } } - if (maxV <= readVersion) { - ok = true; - return true; - } - return false; - } - - bool downLeftSpine() { + downLeftSpine: for (; !n->entryPresent; n = getFirstChildExists(n)) { } ok = n->entry.rangeVersion <= readVersion; @@ -2817,7 +2818,7 @@ bool checkRangeRead(Node *n, std::span begin, if (lcp == int(begin.size())) { CheckRangeRightSide checkRangeRightSide{n, end, lcp, readVersion, tls}; - while (!checkRangeRightSide.step()) + for (; !checkRangeRightSide.step(); ++tls->range_read_iterations_accum) ; return checkRangeRightSide.ok; } @@ -2831,30 +2832,11 @@ bool checkRangeRead(Node *n, std::span begin, // 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}; + for (; !checkRangeLeftSide.step(); ++tls->range_read_iterations_accum) + ; CheckRangeRightSide checkRangeRightSide{n, end, lcp + 1, readVersion, tls}; - - for (;;) { - bool leftDone = checkRangeLeftSide.step(); - bool rightDone = checkRangeRightSide.step(); - if (!leftDone && !rightDone) { - tls->range_read_iterations_accum += 2; - continue; - } - if (leftDone && rightDone) { - break; - } else if (leftDone) { - while (!checkRangeRightSide.step()) { - ++tls->range_read_iterations_accum; - } - break; - } else { - assert(rightDone); - while (!checkRangeLeftSide.step()) { - ++tls->range_read_iterations_accum; - } - } - break; - } + for (; !checkRangeRightSide.step(); ++tls->range_read_iterations_accum) + ; return checkRangeLeftSide.ok && checkRangeRightSide.ok; }