Strengthen precondition to checkRangeStartsWith

and remove resulting dead code
This commit is contained in:
2024-03-18 15:44:44 -07:00
parent 97717cec86
commit 5a0bcf9a5a

View File

@@ -1672,7 +1672,10 @@ Vector<uint8_t> getSearchPath(Arena &arena, Node *n) {
} // GCOVR_EXCL_LINE } // GCOVR_EXCL_LINE
// Return true if the max version among all keys that start with key + [child], // Return true if the max version among all keys that start with key + [child],
// where begin < child < end, is <= readVersion // where begin < child < end, is <= readVersion.
//
// Precondition: transitively, no child of n has a search path that's a longer
// prefix of key than n
bool checkRangeStartsWith(Node *n, std::span<const uint8_t> key, int begin, bool checkRangeStartsWith(Node *n, std::span<const uint8_t> key, int begin,
int end, int64_t readVersion, int end, int64_t readVersion,
ConflictSet::Impl *impl) { ConflictSet::Impl *impl) {
@@ -1680,53 +1683,51 @@ bool checkRangeStartsWith(Node *n, std::span<const uint8_t> key, int begin,
fprintf(stderr, "%s(%02x,%02x)*\n", printable(key).c_str(), begin, end); fprintf(stderr, "%s(%02x,%02x)*\n", printable(key).c_str(), begin, end);
#endif #endif
auto remaining = key; auto remaining = key;
for (;;) { if (remaining.size() == 0) {
if (remaining.size() == 0) { return maxBetweenExclusive(n, begin, end) <= readVersion;
return maxBetweenExclusive(n, begin, end) <= readVersion; }
}
auto *child = getChild(n, remaining[0]); auto *child = getChild(n, remaining[0]);
if (child == nullptr) { if (child == nullptr) {
int c = getChildGeq(n, remaining[0]); int c = getChildGeq(n, remaining[0]);
if (c >= 0) { if (c >= 0) {
n = getChildExists(n, c); n = getChildExists(n, c);
goto downLeftSpine;
} else {
n = nextSibling(n);
goto downLeftSpine;
}
}
n = child;
remaining = remaining.subspan(1, remaining.size() - 1);
assert(n->partialKeyLen > 0);
{
int commonLen = std::min<int>(n->partialKeyLen, remaining.size());
int i = longestCommonPrefix(n->partialKey(), remaining.data(), commonLen);
if (i < commonLen) {
auto c = n->partialKey()[i] <=> remaining[i];
if (c > 0) {
goto downLeftSpine; goto downLeftSpine;
} else { } else {
n = nextSibling(n); n = nextSibling(n);
goto downLeftSpine; goto downLeftSpine;
} }
} }
assert(n->partialKeyLen > int(remaining.size()));
n = child; if (begin < n->partialKey()[remaining.size()] &&
remaining = remaining.subspan(1, remaining.size() - 1); n->partialKey()[remaining.size()] < end) {
if (n->entryPresent && n->entry.rangeVersion > readVersion) {
if (n->partialKeyLen > 0) { return false;
int commonLen = std::min<int>(n->partialKeyLen, remaining.size());
int i = longestCommonPrefix(n->partialKey(), remaining.data(), commonLen);
if (i < commonLen) {
auto c = n->partialKey()[i] <=> remaining[i];
if (c > 0) {
goto downLeftSpine;
} else {
n = nextSibling(n);
goto downLeftSpine;
}
}
if (commonLen == n->partialKeyLen) {
// partial key matches
remaining = remaining.subspan(commonLen, remaining.size() - commonLen);
} else if (n->partialKeyLen > int(remaining.size())) {
if (begin < n->partialKey()[remaining.size()] &&
n->partialKey()[remaining.size()] < end) {
if (n->entryPresent && n->entry.rangeVersion > readVersion) {
return false;
}
return maxVersion(n, impl) <= readVersion;
}
return true;
} }
return maxVersion(n, impl) <= readVersion;
} }
return true;
} }
__builtin_unreachable(); // GCOVR_EXCL_LINE
downLeftSpine: downLeftSpine:
if (n == nullptr) { if (n == nullptr) {
return true; return true;