Add short-circuiting back to checkRangeRead
This commit is contained in:
@@ -547,6 +547,46 @@ Node *nextSibling(Node *node, Vector<uint8_t> &searchPath) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Performs a physical search for remaining
|
||||||
|
struct SearchStepWise {
|
||||||
|
Node *n;
|
||||||
|
std::span<const uint8_t> remaining;
|
||||||
|
|
||||||
|
SearchStepWise() {}
|
||||||
|
SearchStepWise(Node *n, std::span<const uint8_t> remaining)
|
||||||
|
: n(n), remaining(remaining) {
|
||||||
|
assert(n->partialKeyLen == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool step() {
|
||||||
|
if (remaining.size() == 0) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
int c = getChildGeq(n, remaining[0]);
|
||||||
|
if (c == remaining[0]) {
|
||||||
|
auto *child = getChildExists(n, c);
|
||||||
|
int i = 0;
|
||||||
|
for (; i < child->partialKeyLen; ++i) {
|
||||||
|
if (!(i + 1 < int(remaining.size()) &&
|
||||||
|
remaining[i + 1] == child->partialKey[i])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i != child->partialKeyLen) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
n = child;
|
||||||
|
remaining =
|
||||||
|
remaining.subspan(1 + child->partialKeyLen,
|
||||||
|
remaining.size() - (1 + child->partialKeyLen));
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct FirstGeqStepwise {
|
struct FirstGeqStepwise {
|
||||||
Node *n;
|
Node *n;
|
||||||
std::span<const uint8_t> remaining;
|
std::span<const uint8_t> remaining;
|
||||||
@@ -894,6 +934,26 @@ bytes:
|
|||||||
bool checkRangeRead(Node *n, const std::span<const uint8_t> begin,
|
bool checkRangeRead(Node *n, const std::span<const uint8_t> begin,
|
||||||
const std::span<const uint8_t> end, int64_t readVersion,
|
const std::span<const uint8_t> end, int64_t readVersion,
|
||||||
Arena &arena) {
|
Arena &arena) {
|
||||||
|
|
||||||
|
int cl = std::min(begin.size(), end.size());
|
||||||
|
int lcp = longestCommonPrefix(begin.data(), end.data(), cl);
|
||||||
|
|
||||||
|
SearchStepWise search{n, begin.subspan(0, lcp)};
|
||||||
|
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);
|
||||||
|
|
||||||
auto left = firstGeq(n, begin);
|
auto left = firstGeq(n, begin);
|
||||||
|
|
||||||
#if DEBUG_VERBOSE && !defined(NDEBUG)
|
#if DEBUG_VERBOSE && !defined(NDEBUG)
|
||||||
|
Reference in New Issue
Block a user