Prevent unnecessary rotations

This commit is contained in:
2024-05-14 10:26:40 -07:00
parent 9834b2e811
commit b3ad250f41

View File

@@ -690,8 +690,9 @@ struct __attribute__((__visibility__("hidden"))) VersionedMap::Impl {
template <std::memory_order kOrder, class T> template <std::memory_order kOrder, class T>
void search(Key key, T root, int64_t version, Finger &finger) const { void search(Key key, T root, int64_t version, Finger &finger) const {
finger.clear(); // Prevent integer promotion etc
static_assert(std::is_same_v<T, uint32_t>); static_assert(std::is_same_v<T, uint32_t>);
finger.clear();
if (root == 0) { if (root == 0) {
return; return;
} }
@@ -746,7 +747,7 @@ struct __attribute__((__visibility__("hidden"))) VersionedMap::Impl {
finger.copyTo(copy); finger.copyTo(copy);
move<std::memory_order_relaxed>(copy, latestVersion, true); move<std::memory_order_relaxed>(copy, latestVersion, true);
if (copy.searchPathSize() == 0) { if (copy.searchPathSize() == 0) {
rangeVersion = -1; rangeVersion = -1; // Sentinel for "no mutation ending here"
} else { } else {
rangeVersion = mm.base[copy.backNode()].entry->rangeVersion; rangeVersion = mm.base[copy.backNode()].entry->rangeVersion;
} }
@@ -757,8 +758,8 @@ struct __attribute__((__visibility__("hidden"))) VersionedMap::Impl {
} else { } else {
rangeVersion = latestVersion; rangeVersion = latestVersion;
if (inserted) { if (inserted) {
val = {nullptr, -1}; val = {nullptr, -1}; // Sentinel for "no point mutation here"
pointVersion = -1; pointVersion = -1; // Sentinel for "no point mutation here"
} else { } else {
auto *entry = mm.base[finger.backNode()].entry; auto *entry = mm.base[finger.backNode()].entry;
val = {entry->getVal(), entry->valLen}; val = {entry->getVal(), entry->valLen};
@@ -767,8 +768,9 @@ struct __attribute__((__visibility__("hidden"))) VersionedMap::Impl {
} }
// Prepare new node // Prepare new node
uint32_t node = uint32_t node = newNode(
newNode(pointVersion, rangeVersion, key.p, key.len, val->p, val->len); pointVersion, rangeVersion, key.p, key.len, val->p, val->len,
inserted ? random.next() : mm.base[finger.backNode()].entry->priority);
if (!inserted) { if (!inserted) {
auto &n = mm.base[node]; auto &n = mm.base[node];
n.pointer[0] = child<std::memory_order_relaxed>(finger.backNode(), false, n.pointer[0] = child<std::memory_order_relaxed>(finger.backNode(), false,
@@ -881,15 +883,16 @@ struct __attribute__((__visibility__("hidden"))) VersionedMap::Impl {
} }
uint32_t newNode(int64_t version, int64_t rangeVersion, const uint8_t *key, uint32_t newNode(int64_t version, int64_t rangeVersion, const uint8_t *key,
int keyLen, const uint8_t *val, int valLen) { int keyLen, const uint8_t *val, int valLen,
uint32_t priority) {
auto result = mm.allocate(); auto result = mm.allocate();
auto &node = mm.base[result]; auto &node = mm.base[result];
node.updateVersion = version; node.updateVersion = version;
node.pointer[0] = 0; node.pointer[0] = 0;
node.pointer[1] = 0; node.pointer[1] = 0;
node.updated.store(false, std::memory_order_relaxed); node.updated.store(false, std::memory_order_relaxed);
node.entry = Entry::make(version, rangeVersion, key, keyLen, val, valLen, node.entry =
random.next()); Entry::make(version, rangeVersion, key, keyLen, val, valLen, priority);
return result; return result;
} }