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
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:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user