From 729fcdb616344ee265cc6ebb104db68ce4a48d9a Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Fri, 14 Jun 2024 16:00:08 -0700 Subject: [PATCH] Avoid some insertions in point clears --- VersionedMap.cpp | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/VersionedMap.cpp b/VersionedMap.cpp index 933da46..8cfc416 100644 --- a/VersionedMap.cpp +++ b/VersionedMap.cpp @@ -902,19 +902,34 @@ struct __attribute__((__visibility__("hidden"))) VersionedMap::Impl { if (m.param2Len == 0) { search({m.param1, m.param1Len}, latestRoot, latestVersion, iter); - insert({m.param1, m.param1Len}, {{nullptr, -1}}, iter); + const bool found = iter.searchPathSize() > 0 && iter.backNode() != 0; - const bool engulfLeft = mm.base[iter.backNode()].entry->clearTo(); - move(iter, latestVersion); - const auto *next = iter.searchPathSize() > 0 - ? mm.base[iter.backNode()].entry - : nullptr; - if (engulfLeft && next && next->clearTo()) { - insert({next->getKey(), next->keyLen}, {}, iter); - move(iter, latestVersion); - remove(iter); + bool engulfLeft = found && mm.base[iter.backNode()].entry->clearTo(); + bool engulfRight = false; + const Entry *next; + Finger copy; + + if (iter.searchPathSize() > 0) { + iter.copyTo(copy); + move(copy, latestVersion); + next = copy.searchPathSize() > 0 ? mm.base[copy.backNode()].entry + : nullptr; + if (next && next->clearTo()) { + engulfRight = true; + if (!found) { + engulfLeft = true; + } + } } + if (engulfLeft && engulfRight) { + insert({next->getKey(), next->keyLen}, {}, copy); + if (found) { + remove(iter); + } + } else { + insert({m.param1, m.param1Len}, {{nullptr, -1}}, iter); + } } else { search({m.param1, m.param1Len}, latestRoot, latestVersion, iter);