From 986e533c8c1dfcff04ad2bf3b06e020a416d1ee5 Mon Sep 17 00:00:00 2001 From: Steve Atherton Date: Thu, 20 Feb 2020 22:20:27 -0800 Subject: [PATCH] Bug fix, DeltaTree was not updating numItems after erase / insert operations which only change the deleted flag of an existing equivalent entry. --- fdbserver/DeltaTree.h | 2 ++ fdbserver/VersionedBTree.actor.cpp | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/fdbserver/DeltaTree.h b/fdbserver/DeltaTree.h index 38c08798e6..6eda062249 100644 --- a/fdbserver/DeltaTree.h +++ b/fdbserver/DeltaTree.h @@ -370,6 +370,7 @@ public: auto &d = n->raw->delta(); if(d.getDeleted()) { d.setDeleted(false); + ++tree->numItems; return true; } else { @@ -504,6 +505,7 @@ public: void erase() { node->setDeleted(true); + --mirror->tree->numItems; moveNext(); } diff --git a/fdbserver/VersionedBTree.actor.cpp b/fdbserver/VersionedBTree.actor.cpp index e20ac49b78..462f351893 100644 --- a/fdbserver/VersionedBTree.actor.cpp +++ b/fdbserver/VersionedBTree.actor.cpp @@ -5699,21 +5699,27 @@ TEST_CASE("!/redwood/correctness/unit/deltaTree/RedwoodRecordRef") { // Test delete/insert behavior for each item, making no net changes printf("Testing seek/delete/insert for existing keys with random values\n"); + ASSERT(tree->numItems == items.size()); for(auto rec : items) { // Insert existing should fail ASSERT(!r.insert(rec)); + ASSERT(tree->numItems == items.size()); // Erase existing should succeed ASSERT(r.erase(rec)); + ASSERT(tree->numItems == items.size() - 1); // Erase deleted should fail ASSERT(!r.erase(rec)); + ASSERT(tree->numItems == items.size() - 1); // Insert deleted should succeed ASSERT(r.insert(rec)); + ASSERT(tree->numItems == items.size()); // Insert existing should fail ASSERT(!r.insert(rec)); + ASSERT(tree->numItems == items.size()); } DeltaTree::Cursor fwd = r.getCursor();