Detect singleton key ranges
All checks were successful
Tests / Release [gcc] total: 583, passed: 583
GNU C Compiler (gcc) |Total|New|Outstanding|Fixed|Trend |:-:|:-:|:-:|:-:|:-: |0|0|0|0|:clap: Reference build: <a href="https://jenkins.weaselab.dev/job/weaselab/job/conflict-set/job/main/25//gcc">weaselab » conflict-set » main #25</a>
Tests / Coverage total: 581, passed: 581
weaselab/conflict-set/pipeline/head This commit looks good

This commit is contained in:
2024-02-20 23:09:03 -08:00
parent e706aad989
commit a341b36f63

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);
}
}
}