]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/omap: add tests for range remove
authorXinyu Huang <xinyu.huang@intel.com>
Wed, 14 Sep 2022 09:13:07 +0000 (09:13 +0000)
committerXinyu Huang <xinyu.huang@intel.com>
Tue, 13 Dec 2022 09:49:55 +0000 (09:49 +0000)
Signed-off-by: Xinyu Huang <xinyu.huang@intel.com>
src/test/crimson/seastore/test_omap_manager.cc

index a571500e4c92d4ecd10b827f39fb035faeb58f50..9e3ee1043de5e61db89a571cf3f3237250e4f742 100644 (file)
@@ -137,6 +137,40 @@ struct omap_manager_test_t :
     test_omap_mappings.erase(test_omap_mappings.find(key));
   }
 
+  std::vector<std::string> rm_key_range(
+    omap_root_t &omap_root,
+    Transaction &t,
+    const std::string &first,
+    const std::string &last) {
+    logger().debug("rm keys in range {} ~ {}", first, last);
+    auto config = OMapManager::omap_list_config_t::with_max(3000);
+    config.inclusive = true;
+
+    with_trans_intr(
+      t,
+      [&, this](auto &t) {
+      return omap_manager->omap_rm_key_range(
+       omap_root, t, first, last, config);
+    }).unsafe_get0();
+
+    std::vector<std::string> keys;
+    size_t count = 0;
+    for (auto iter = test_omap_mappings.begin();
+       iter != test_omap_mappings.end(); ) {
+      if (iter->first >= first && iter->first <= last) {
+       keys.push_back(iter->first);
+       iter = test_omap_mappings.erase(iter);
+       count++;
+      } else {
+       iter++;
+      }
+      if (count == config.max_result_size) {
+       break;
+      }
+    }
+    return keys;
+  }
+
   void list(
     const omap_root_t &omap_root,
     Transaction &t,
@@ -183,8 +217,9 @@ struct omap_manager_test_t :
 
     for (auto &&[k, v]: results) {
       EXPECT_NE(it, test_omap_mappings.end());
-      if (it == test_omap_mappings.end())
+      if (it == test_omap_mappings.end()) {
        return;
+      }
       EXPECT_EQ(k, it->first);
       EXPECT_EQ(v, it->second);
       it++;
@@ -377,8 +412,9 @@ TEST_F(omap_manager_test_t, force_leafnode_split_merge_fullandbalanced)
         check_mappings(omap_root, *t);
         check_mappings(omap_root);
       }
-      if (i == 100)
+      if (i == 100) {
         break;
+      }
     }
     logger().debug("finally submitting transaction ");
     submit_transaction(std::move(t));
@@ -386,7 +422,7 @@ TEST_F(omap_manager_test_t, force_leafnode_split_merge_fullandbalanced)
   });
 }
 
-TEST_F(omap_manager_test_t, force_split_listkeys_list_clear)
+TEST_F(omap_manager_test_t, force_split_listkeys_list_rmkey_range_clear)
 {
   run_async([this] {
     omap_root_t omap_root = initialize();
@@ -452,6 +488,20 @@ TEST_F(omap_manager_test_t, force_split_listkeys_list_clear)
       list(omap_root, *t, first_temp, last_temp, 10240, true);
     }
 
+    {
+      auto t = create_read_transaction();
+      list(omap_root, *t, first, last, 10240, true);
+    }
+
+    {
+      auto t = create_mutate_transaction();
+      auto keys = rm_key_range(omap_root, *t, first, last);
+      for (const auto& key : keys) {
+       get_value(omap_root, *t, key);
+      }
+      submit_transaction(std::move(t));
+    }
+
     {
       auto t = create_mutate_transaction();
       clear(omap_root, *t);
@@ -460,7 +510,7 @@ TEST_F(omap_manager_test_t, force_split_listkeys_list_clear)
   });
 }
 
-TEST_F(omap_manager_test_t, force_inner_node_split_list)
+TEST_F(omap_manager_test_t, force_inner_node_split_list_rmkey_range)
 {
   run_async([this] {
     omap_root_t omap_root = initialize();
@@ -515,6 +565,15 @@ TEST_F(omap_manager_test_t, force_inner_node_split_list)
       list(omap_root, *t, first_temp, last_temp, 10240, true);
     }
 
+    {
+      auto t = create_mutate_transaction();
+      auto keys = rm_key_range(omap_root, *t, first, last);
+      for (const auto& key : keys) {
+       get_value(omap_root, *t, key);
+      }
+      submit_transaction(std::move(t));
+    }
+
     {
       auto t = create_mutate_transaction();
       clear(omap_root, *t);