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