Detect singleton key ranges

This commit is contained in:
2024-02-20 23:09:03 -08:00
parent e706aad989
commit a341b36f63
+26 -15
View File
@@ -1229,6 +1229,10 @@ bool checkRangeRead(Node *n, std::span<const uint8_t> begin,
std::span<const uint8_t> end, int64_t readVersion) {
int lcp = longestCommonPrefix(begin.data(), end.data(),
std::min(begin.size(), end.size()));
if (lcp == int(begin.size()) && end.size() == begin.size() + 1 &&
end.back() == 0) {
return checkPointRead(n, begin, readVersion);
}
SearchStepWise search{n, begin.subspan(0, lcp)};
Arena arena;
@@ -1390,6 +1394,23 @@ void destroyTree(Node *root) {
}
}
void addPointWrite(Node *&root, int64_t oldestVersion,
const ConflictSet::WriteRange &w) {
auto *n = insert(&root, std::span<const uint8_t>(w.begin.p, w.begin.len),
w.writeVersion, true);
if (!n->entryPresent) {
auto *p = nextLogical(n);
n->entryPresent = true;
n->entry.pointVersion = w.writeVersion;
n->maxVersion = w.writeVersion;
n->entry.rangeVersion =
p != nullptr ? p->entry.rangeVersion : oldestVersion;
} else {
n->entry.pointVersion = std::max(n->entry.pointVersion, w.writeVersion);
n->maxVersion = std::max(n->maxVersion, w.writeVersion);
}
}
void addWriteRange(Node *&root, int64_t oldestVersion,
const ConflictSet::WriteRange &w) {
@@ -1398,6 +1419,10 @@ void addWriteRange(Node *&root, int64_t oldestVersion,
int lcp = longestCommonPrefix(begin.data(), end.data(),
std::min(begin.size(), end.size()));
if (lcp == int(begin.size()) && end.size() == begin.size() + 1 &&
end.back() == 0) {
return addPointWrite(root, oldestVersion, w);
}
auto remaining = begin.subspan(0, lcp);
auto *n = root;
@@ -1619,21 +1644,7 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
addWriteRange(root, oldestVersion, w);
} else {
keyUpdates += 1;
auto *n =
insert(&root, std::span<const uint8_t>(w.begin.p, w.begin.len),
w.writeVersion, true);
if (!n->entryPresent) {
auto *p = nextLogical(n);
n->entryPresent = true;
n->entry.pointVersion = w.writeVersion;
n->maxVersion = w.writeVersion;
n->entry.rangeVersion =
p != nullptr ? p->entry.rangeVersion : oldestVersion;
} else {
n->entry.pointVersion =
std::max(n->entry.pointVersion, w.writeVersion);
n->maxVersion = std::max(n->maxVersion, w.writeVersion);
}
addPointWrite(root, oldestVersion, w);
}
}
}