From 0619b6325cf27e628d2047297ef922e58f95596a Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Fri, 22 Nov 2024 15:37:53 -0800 Subject: [PATCH] Convert checkPrefixRead to IteratorBase --- ConflictSet.cpp | 51 ++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index a94e43d..2455faf 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -2037,6 +2037,8 @@ IteratorBase IteratorBase::getChildGeq(int index) { } } +InternalVersionT IteratorBase::getMaxVersion() { return ::maxVersion(node); } + bool IteratorBase::checkRangeVersionOfFirstGeq(InternalVersionT readVersion) { return ::checkRangeVersionOfFirstGeq(node, readVersion); } @@ -4616,7 +4618,7 @@ bool checkPointRead(IteratorBase n, const TrivialSpan key, // Logically this is the same as performing firstGeq and then checking against // max version or range version if this prefix doesn't exist, but this version // short circuits as soon as it can prove that there's no conflict. -bool checkPrefixRead(Node *n, const TrivialSpan key, +bool checkPrefixRead(IteratorBase n, const TrivialSpan key, InternalVersionT readVersion, ReadContext *readContext) { ++readContext->prefix_read_accum; #if DEBUG_VERBOSE && !defined(NDEBUG) @@ -4626,54 +4628,55 @@ bool checkPrefixRead(Node *n, const TrivialSpan key, for (;; ++readContext->prefix_read_iterations_accum) { 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 n.getMaxVersion() <= readVersion; } - auto [c, maxV] = getChildAndMaxVersion(n, remaining[0]); - Node *child = c; - if (child == nullptr) { - auto c = getChildGeq(n, remaining[0]); - if (c != nullptr) { - n = c; - return checkRangeVersionOfFirstGeq(n, readVersion); + auto [c, maxV] = n.getChildAndMaxVersion(remaining[0]); + IteratorBase child = c; + if (!child.valid()) { + auto c = n.getChildGeq(remaining[0]); + if (c.valid()) { + return c.checkRangeVersionOfFirstGeq(readVersion); } else { - n = nextSibling(n); - if (n == nullptr) { + n = n.nextSibling(); + if (!n.valid()) { return true; } - return checkRangeVersionOfFirstGeq(n, readVersion); + return n.checkRangeVersionOfFirstGeq(readVersion); } } n = child; remaining = remaining.subspan(1, remaining.size() - 1); - if (n->partialKeyLen > 0) { - int commonLen = std::min(n->partialKeyLen, remaining.size()); - int i = longestCommonPrefix(n->partialKey(), remaining.data(), commonLen); + auto partialKey = n.partialKey(); + if (partialKey.size() > 0) { + int commonLen = std::min(partialKey.size(), remaining.size()); + int i = + longestCommonPrefix(partialKey.data(), remaining.data(), commonLen); if (i < commonLen) { - auto c = n->partialKey()[i] <=> remaining[i]; + auto c = partialKey[i] <=> remaining[i]; if (c > 0) { - return checkRangeVersionOfFirstGeq(n, readVersion); + return n.checkRangeVersionOfFirstGeq(readVersion); } else { - n = nextSibling(n); - if (n == nullptr) { + n = n.nextSibling(); + if (!n.valid()) { return true; } - return checkRangeVersionOfFirstGeq(n, readVersion); + return n.checkRangeVersionOfFirstGeq(readVersion); } } - if (commonLen == n->partialKeyLen) { + if (commonLen == partialKey.size()) { // partial key matches remaining = remaining.subspan(commonLen, remaining.size() - commonLen); - } else if (n->partialKeyLen > remaining.size()) { + } else if (partialKey.size() > remaining.size()) { // n is the first physical node greater than remaining, and there's no // eq node. All physical nodes that start with prefix are reachable from // n. if (maxV > readVersion) { return false; } - return checkRangeVersionOfFirstGeq(n, readVersion); + return n.checkRangeVersionOfFirstGeq(readVersion); } } @@ -4866,7 +4869,7 @@ bool checkRangeRead(Node *n, TrivialSpan begin, TrivialSpan end, } if (lcp == begin.size() - 1 && end.size() == begin.size() && begin.back() + 1 == end.back()) { - return checkPrefixRead(n, begin, readVersion, readContext); + return checkPrefixRead(IteratorBase{n}, begin, readVersion, readContext); } ++readContext->range_read_accum;