From 69a131df383458ee346e08e92fba9c1140c513c7 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Sat, 12 Oct 2024 23:01:47 -0700 Subject: [PATCH] Prepare for interleaving checkRangeRightSide --- ConflictSet.cpp | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index c8b2d72..ff328d3 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -2496,27 +2496,19 @@ bool checkRangeRightSide(Node *n, std::span key, int prefixLen, auto remaining = key; int searchPathLen = 0; - for (;; ++tls->range_read_iterations_accum) { - assert(searchPathLen <= int(key.size())); - if (remaining.size() == 0) { - goto downLeftSpine; - } + assert(remaining.size() > 0); - if (searchPathLen >= prefixLen) { - if (n->entryPresent && n->entry.pointVersion > readVersion) { - return false; - } - - if (!checkMaxBetweenExclusive(n, -1, remaining[0], readVersion, tls)) { - return false; - } - } - - if (searchPathLen > prefixLen && n->entryPresent && - n->entry.rangeVersion > readVersion) { + if (prefixLen == 0) { + if (n->entryPresent && n->entry.pointVersion > readVersion) { return false; } + if (!checkMaxBetweenExclusive(n, -1, remaining[0], readVersion, tls)) { + return false; + } + } + + for (;;) { Node *child = getChild(n, remaining[0]); if (child == nullptr) { auto c = getChildGeq(n, remaining[0]); @@ -2556,6 +2548,24 @@ bool checkRangeRightSide(Node *n, std::span key, int prefixLen, goto downLeftSpine; } } + + ++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; + } + + if (!checkMaxBetweenExclusive(n, -1, remaining[0], readVersion, tls)) { + return false; + } } backtrack: for (;;) {