Separate beginIsPrefix path and simplify slightly
This commit is contained in:
@@ -3202,59 +3202,72 @@ void addWriteRange(Node *&root, std::span<const uint8_t> begin,
|
|||||||
|
|
||||||
Node **useAsRoot =
|
Node **useAsRoot =
|
||||||
insert(&root, begin.subspan(0, lcp), writeVersion, tls, impl);
|
insert(&root, begin.subspan(0, lcp), writeVersion, tls, impl);
|
||||||
|
begin = begin.subspan(lcp, begin.size() - lcp);
|
||||||
|
end = end.subspan(lcp, end.size() - lcp);
|
||||||
|
|
||||||
int consumed = lcp;
|
if (beginIsPrefix) {
|
||||||
|
auto *beginNode = *useAsRoot;
|
||||||
begin = begin.subspan(consumed, begin.size() - consumed);
|
addKey(beginNode);
|
||||||
end = end.subspan(consumed, end.size() - consumed);
|
if (!beginNode->entryPresent) {
|
||||||
|
++tls->accum.entries_inserted;
|
||||||
auto *beginNode = *insert(useAsRoot, begin, writeVersion, tls, impl);
|
auto *p = nextLogical(beginNode);
|
||||||
|
beginNode->entry.rangeVersion =
|
||||||
const bool insertedBegin = !beginNode->entryPresent;
|
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
|
||||||
|
beginNode->entryPresent = true;
|
||||||
addKey(beginNode);
|
}
|
||||||
beginNode->entryPresent = true;
|
|
||||||
|
|
||||||
if (insertedBegin) {
|
|
||||||
++tls->accum.entries_inserted;
|
|
||||||
auto *p = nextLogical(beginNode);
|
|
||||||
beginNode->entry.rangeVersion =
|
|
||||||
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
|
|
||||||
beginNode->entry.pointVersion = writeVersion;
|
beginNode->entry.pointVersion = writeVersion;
|
||||||
}
|
|
||||||
assert(writeVersion >= beginNode->entry.pointVersion);
|
|
||||||
beginNode->entry.pointVersion = writeVersion;
|
|
||||||
|
|
||||||
auto *endNode = *insert(useAsRoot, end, writeVersion, tls, impl);
|
auto *endNode = *insert(useAsRoot, end, writeVersion, tls, impl);
|
||||||
|
addKey(endNode);
|
||||||
const bool insertedEnd = !endNode->entryPresent;
|
if (!endNode->entryPresent) {
|
||||||
|
++tls->accum.entries_inserted;
|
||||||
addKey(endNode);
|
auto *p = nextLogical(endNode);
|
||||||
endNode->entryPresent = true;
|
endNode->entry.pointVersion =
|
||||||
|
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
|
||||||
if (insertedEnd) {
|
|
||||||
++tls->accum.entries_inserted;
|
|
||||||
auto *p = nextLogical(endNode);
|
|
||||||
endNode->entry.pointVersion =
|
|
||||||
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
|
|
||||||
if (beginIsPrefix) {
|
|
||||||
// beginNode may have been invalidated when inserting end
|
// beginNode may have been invalidated when inserting end
|
||||||
beginNode = *useAsRoot;
|
beginNode = *useAsRoot;
|
||||||
assert(beginNode->entryPresent);
|
endNode->entryPresent = true;
|
||||||
}
|
}
|
||||||
}
|
endNode->entry.rangeVersion = writeVersion;
|
||||||
endNode->entry.rangeVersion = writeVersion;
|
|
||||||
|
for (beginNode = nextLogical(beginNode); beginNode != endNode;
|
||||||
|
beginNode = erase(beginNode, tls, impl, /*logical*/ true, endNode)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inserting end trashed endNode's maxVersion. Fix that
|
||||||
|
fixupMaxVersion(endNode, impl, tls);
|
||||||
|
} else /*!beginIsPrefix*/ {
|
||||||
|
auto *beginNode = *insert(useAsRoot, begin, writeVersion, tls, impl);
|
||||||
|
addKey(beginNode);
|
||||||
|
if (!beginNode->entryPresent) {
|
||||||
|
++tls->accum.entries_inserted;
|
||||||
|
auto *p = nextLogical(beginNode);
|
||||||
|
beginNode->entry.rangeVersion =
|
||||||
|
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
|
||||||
|
beginNode->entryPresent = true;
|
||||||
|
}
|
||||||
|
beginNode->entry.pointVersion = writeVersion;
|
||||||
|
|
||||||
|
auto *endNode = *insert(useAsRoot, end, writeVersion, tls, impl);
|
||||||
|
addKey(endNode);
|
||||||
|
if (!endNode->entryPresent) {
|
||||||
|
++tls->accum.entries_inserted;
|
||||||
|
auto *p = nextLogical(endNode);
|
||||||
|
endNode->entry.pointVersion =
|
||||||
|
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
|
||||||
|
endNode->entryPresent = true;
|
||||||
|
}
|
||||||
|
endNode->entry.rangeVersion = writeVersion;
|
||||||
|
|
||||||
if (!beginIsPrefix) {
|
|
||||||
eraseBetween(*useAsRoot, begin[0] + 1, end[0], tls);
|
eraseBetween(*useAsRoot, begin[0] + 1, end[0], tls);
|
||||||
}
|
|
||||||
|
|
||||||
for (beginNode = nextLogical(beginNode); beginNode != endNode;
|
for (beginNode = nextLogical(beginNode); beginNode != endNode;
|
||||||
beginNode = erase(beginNode, tls, impl, /*logical*/ true, endNode)) {
|
beginNode = erase(beginNode, tls, impl, /*logical*/ true, endNode)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Inserting end trashed endNode's maxVersion. Fix that
|
// Inserting end trashed endNode's maxVersion. Fix that
|
||||||
fixupMaxVersion(endNode, impl, tls);
|
fixupMaxVersion(endNode, impl, tls);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Node *firstGeqPhysical(Node *n, const std::span<const uint8_t> key) {
|
Node *firstGeqPhysical(Node *n, const std::span<const uint8_t> key) {
|
||||||
|
Reference in New Issue
Block a user