diff --git a/ConflictSet.cpp b/ConflictSet.cpp index a539a75..57f7aad 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -1061,6 +1061,31 @@ bool checkRangeRead(Node *n, std::span begin, int lcp = longestCommonPrefix(begin.data(), end.data(), std::min(begin.size(), end.size())); + SearchStepWise search{n, begin.subspan(0, lcp)}; + Arena arena; + for (;;) { + assert(getSearchPath(arena, search.n) <=> + begin.subspan(0, lcp - search.remaining.size()) == + 0); + if (search.n->maxVersion <= readVersion) { + return true; + } + if (search.step()) { + break; + } + } + assert(getSearchPath(arena, search.n) <=> + begin.subspan(0, lcp - search.remaining.size()) == + 0); + + const int consumed = lcp - search.remaining.size(); + assert(consumed >= 0); + + begin = begin.subspan(consumed, int(begin.size()) - consumed); + end = end.subspan(consumed, int(end.size()) - consumed); + n = search.n; + lcp -= consumed; + if (lcp == int(begin.size())) { for (int i = lcp; i < int(end.size()); ++i) { if (!checkPointRead(n, end.subspan(0, i), readVersion)) {