From a3b5d459eca57b1895ba2fa8ae3f893d99a2ac90 Mon Sep 17 00:00:00 2001 From: Xinyu Huang Date: Wed, 14 Sep 2022 09:11:54 +0000 Subject: [PATCH] crimson/os/seastore/omap: introduce omap range remove Signed-off-by: Xinyu Huang --- src/crimson/os/seastore/omap_manager.h | 17 +++++++++ .../omap_manager/btree/btree_omap_manager.cc | 38 +++++++++++++++++++ .../omap_manager/btree/btree_omap_manager.h | 7 ++++ 3 files changed, 62 insertions(+) diff --git a/src/crimson/os/seastore/omap_manager.h b/src/crimson/os/seastore/omap_manager.h index 2520238a0b7..ad17b2f0077 100644 --- a/src/crimson/os/seastore/omap_manager.h +++ b/src/crimson/os/seastore/omap_manager.h @@ -159,6 +159,23 @@ public: const std::optional &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 * diff --git a/src/crimson/os/seastore/omap_manager/btree/btree_omap_manager.cc b/src/crimson/os/seastore/omap_manager/btree/btree_omap_manager.cc index bbc87965195..300eed4eac1 100644 --- a/src/crimson/os/seastore/omap_manager/btree/btree_omap_manager.cc +++ b/src/crimson/os/seastore/omap_manager/btree/btree_omap_manager.cc @@ -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 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, diff --git a/src/crimson/os/seastore/omap_manager/btree/btree_omap_manager.h b/src/crimson/os/seastore/omap_manager/btree/btree_omap_manager.h index a904951bd08..7fcba64c033 100644 --- a/src/crimson/os/seastore/omap_manager/btree/btree_omap_manager.h +++ b/src/crimson/os/seastore/omap_manager/btree/btree_omap_manager.h @@ -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, -- 2.39.5