From 9e27797ee3b0427384270c2a82abc89d72b11f28 Mon Sep 17 00:00:00 2001 From: Paolo Cocchi Date: Mon, 27 Mar 2023 18:04:59 +0200 Subject: [PATCH] MB-56094: Update CM::numItems at ItemExpel Quantity correctly updated in the CheckpointRemoval path, but we missed to update it when items are released in the Expel path. Change-Id: Ic05cbb3b9c98c6c9073b9b6f74fdfd6604cdcb74 Reviewed-on: https://review.couchbase.org/c/kv_engine/+/188832 Tested-by: Paolo Cocchi Reviewed-by: Vesko Karaganev --- engines/ep/src/checkpoint_manager.cc | 1 + engines/ep/tests/module_tests/checkpoint_test.cc | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/engines/ep/src/checkpoint_manager.cc b/engines/ep/src/checkpoint_manager.cc index fe397d777f..30983cc3b4 100644 --- a/engines/ep/src/checkpoint_manager.cc +++ b/engines/ep/src/checkpoint_manager.cc @@ -687,6 +687,7 @@ CheckpointManager::expelUnreferencedCheckpointItems() { } stats.itemsExpelledFromCheckpoints.fetch_add(numItemsExpelled); + numItems.fetch_sub(numItemsExpelled); // queueLock already released here, O(N) deallocation is lock-free const auto queuedItemsMemReleased = extractRes.deleteItems(); diff --git a/engines/ep/tests/module_tests/checkpoint_test.cc b/engines/ep/tests/module_tests/checkpoint_test.cc index 9155520159..8f78658f46 100644 --- a/engines/ep/tests/module_tests/checkpoint_test.cc +++ b/engines/ep/tests/module_tests/checkpoint_test.cc @@ -2216,7 +2216,9 @@ void CheckpointTest::testExpelCheckpointItems() { * 1002 - 2nd item (key1) <<<<<<< persistenceCursor * 1003 - 3rd item (key2) */ - EXPECT_EQ(1 + itemCount, manager->getNumOpenChkItems()); + const size_t expectedNumItemsPre = 1 + itemCount; + EXPECT_EQ(expectedNumItemsPre, manager->getNumOpenChkItems()); + EXPECT_EQ(expectedNumItemsPre, manager->getNumItems()); const auto expelResult = manager->expelUnreferencedCheckpointItems(); EXPECT_EQ(2, expelResult.count); @@ -2240,8 +2242,9 @@ void CheckpointTest::testExpelCheckpointItems() { } // 1 mutation removed from checkpoint - EXPECT_EQ(1 + (itemCount - expelResult.count), - manager->getNumOpenChkItems()); + const size_t expectedNumItemsPost = 1 + (itemCount - expelResult.count); + EXPECT_EQ(expectedNumItemsPost, manager->getNumOpenChkItems()); + EXPECT_EQ(expectedNumItemsPost, manager->getNumItems()); // Try to register a DCP replication cursor from 1001 - an expelled item. std::string dcp_cursor1(DCP_CURSOR_PREFIX + std::to_string(1));