Allow passing two roots to addWriteRange

This commit is contained in:
2024-10-29 17:24:10 -07:00
parent 7aac73ee80
commit 9015b555de

View File

@@ -3108,26 +3108,13 @@ void fixupMaxVersion(Node *node, WriteContext *writeContext) {
setMaxVersion(node, max);
}
void addWriteRange(TaggedNodePointer &root, std::span<const uint8_t> begin,
std::span<const uint8_t> end, InternalVersionT writeVersion,
WriteContext *writeContext, ConflictSet::Impl *impl) {
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, begin, writeVersion, writeContext);
}
void addWriteRange(TaggedNodePointer &beginRoot, std::span<const uint8_t> begin,
TaggedNodePointer &endRoot, std::span<const uint8_t> end,
InternalVersionT writeVersion, WriteContext *writeContext,
ConflictSet::Impl *impl, bool beginIsPrefix) {
++writeContext->accum.range_writes;
const bool beginIsPrefix = lcp == int(begin.size());
auto useAsRoot =
insert(&root, begin.subspan(0, lcp), writeVersion, writeContext);
begin = begin.subspan(lcp, begin.size() - lcp);
end = end.subspan(lcp, end.size() - lcp);
Node *beginNode = *insert(useAsRoot, begin, writeVersion, writeContext);
Node *beginNode = *insert(&beginRoot, begin, writeVersion, writeContext);
addKey(beginNode);
if (!beginNode->entryPresent) {
++writeContext->accum.entries_inserted;
@@ -3139,7 +3126,7 @@ void addWriteRange(TaggedNodePointer &root, std::span<const uint8_t> begin,
}
beginNode->entry.pointVersion = writeVersion;
Node *endNode = *insert(useAsRoot, end, writeVersion, writeContext);
Node *endNode = *insert(&endRoot, end, writeVersion, writeContext);
addKey(endNode);
if (!endNode->entryPresent) {
++writeContext->accum.entries_inserted;
@@ -3149,7 +3136,7 @@ void addWriteRange(TaggedNodePointer &root, std::span<const uint8_t> begin,
: std::max(p->entry.rangeVersion, writeContext->zero);
if (beginIsPrefix) {
// beginNode may have been invalidated when inserting end
beginNode = *useAsRoot;
beginNode = beginRoot;
assert(beginNode->entryPresent);
}
endNode->entryPresent = true;
@@ -3173,6 +3160,23 @@ void addWriteRange(TaggedNodePointer &root, std::span<const uint8_t> begin,
fixupMaxVersion(iter, writeContext);
}
void addWriteRange(TaggedNodePointer &root, std::span<const uint8_t> begin,
std::span<const uint8_t> end, InternalVersionT writeVersion,
WriteContext *writeContext, ConflictSet::Impl *impl) {
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, begin, writeVersion, writeContext);
}
auto useAsRoot =
insert(&root, begin.subspan(0, lcp), writeVersion, writeContext);
addWriteRange(*useAsRoot, begin.subspan(lcp, begin.size() - lcp), *useAsRoot,
end.subspan(lcp, end.size() - lcp), writeVersion, writeContext,
impl, int(begin.size()) == lcp);
}
Node *firstGeqPhysical(Node *n, const std::span<const uint8_t> key) {
auto remaining = key;
for (;;) {