]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/omap: introduce omap range remove
authorXinyu Huang <xinyu.huang@intel.com>
Wed, 14 Sep 2022 09:11:54 +0000 (09:11 +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/crimson/os/seastore/omap_manager.h
src/crimson/os/seastore/omap_manager/btree/btree_omap_manager.cc
src/crimson/os/seastore/omap_manager/btree/btree_omap_manager.h

index 2520238a0b7384da71e8ade5127715599442021c..ad17b2f007789fa7feaa1494696cda1478457977 100644 (file)
@@ -159,6 +159,23 @@ public:
     const std::optional<std::string> &last,
     omap_list_config_t config = omap_list_config_t()) = 0;
 
+  /**
+   * remove key value mappings in a key range from omap tree
+   *
+   * @param omap_root_t &omap_root,  omap btree root information
+   * @param Transaction &t,  current transaction
+   * @param string &first, range start,  must alive during the call
+   * @param string &last, range end,  must alive during the call
+   */
+  using omap_rm_key_range_iertr = base_iertr;
+  using omap_rm_key_range_ret = omap_rm_key_range_iertr::future<>;
+  virtual omap_rm_key_range_ret omap_rm_key_range(
+    omap_root_t &omap_root,
+    Transaction &t,
+    const std::string &first,
+    const std::string &last,
+    omap_list_config_t config) = 0;
+
   /**
    * clear all omap tree key->value mapping
    *
index bbc87965195bcd84f5196ad6abfc8ff8e646c8d1..300eed4eac1ebffd4053b41b66139533cea59cf8 100644 (file)
@@ -187,6 +187,44 @@ BtreeOMapManager::omap_rm_key(
 
 }
 
+BtreeOMapManager::omap_rm_key_range_ret
+BtreeOMapManager::omap_rm_key_range(
+  omap_root_t &omap_root,
+  Transaction &t,
+  const std::string &first,
+  const std::string &last,
+  omap_list_config_t config)
+{
+  LOG_PREFIX(BtreeOMapManager::omap_rm_key_range);
+  DEBUGT("{} ~ {}", t, first, last);
+  assert(first <= last);
+  return omap_list(
+    omap_root,
+    t,
+    first,
+    last,
+    config
+  ).si_then([this, &omap_root, &t](auto results) {
+    LOG_PREFIX(BtreeOMapManager::omap_rm_key_range);
+    auto &[complete, kvs] = results;
+    std::vector<std::string> keys;
+    for (const auto& [k, _] : kvs) {
+      keys.push_back(k);
+    }
+    DEBUGT("total {} keys to remove", t, keys.size());
+    return seastar::do_with(
+      std::move(keys),
+      [this, &omap_root, &t](auto& keys) {
+      return trans_intr::do_for_each(
+       keys.begin(),
+       keys.end(),
+       [this, &omap_root, &t](auto& key) {
+       return omap_rm_key(omap_root, t, key);
+      });
+    });
+  });
+}
+
 BtreeOMapManager::omap_list_ret
 BtreeOMapManager::omap_list(
   const omap_root_t &omap_root,
index a904951bd08214cfa4b5651bbbd04aa3dce4f700..7fcba64c033470087cc946a8390327191d77309e 100644 (file)
@@ -87,6 +87,13 @@ public:
     Transaction &t,
     const std::string &key) final;
 
+  omap_rm_key_range_ret omap_rm_key_range(
+    omap_root_t &omap_root,
+    Transaction &t,
+    const std::string &first,
+    const std::string &last,
+    omap_list_config_t config) final;
+
   omap_list_ret omap_list(
     const omap_root_t &omap_root,
     Transaction &t,