From 2c03e77e042d54e2367f7ce3551fa59abde5f826 Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Wed, 11 Dec 2024 10:39:15 +0800 Subject: [PATCH] crimson/os/seastore: introduce omaptree_clear() Signed-off-by: Yingxin Cheng Signed-off-by: Myoungwon Oh --- src/crimson/os/seastore/seastore.cc | 107 ++++++++++++++++------------ src/crimson/os/seastore/seastore.h | 20 +++++- 2 files changed, 80 insertions(+), 47 deletions(-) diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index 42c44f6087152..ba4eef8e7879c 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -2058,43 +2058,86 @@ SeaStore::Shard::_rename( ); } -SeaStore::Shard::tm_ret -SeaStore::Shard::_remove_omaps( - internal_context_t &ctx, +SeaStore::base_iertr::future +SeaStore::Shard::omaptree_do_clear( + Transaction& t, omap_root_t&& root) { - if (root.is_null()) { - return tm_iertr::now(); - } + assert(!root.is_null()); return seastar::do_with( BtreeOMapManager(*transaction_manager), std::move(root), - [&ctx](auto &omap_manager, auto &root) + [&t](auto &omap_manager, auto &root) { - return omap_manager.omap_clear(root, *ctx.transaction + return omap_manager.omap_clear(root, t ).si_then([&root] { assert(root.is_null()); + return root; }); }); } +SeaStore::base_iertr::future<> +SeaStore::Shard::omaptree_clear_no_onode( + Transaction& t, + omap_root_t&& root) +{ + LOG_PREFIX(SeaStoreS::omaptree_clear_no_onode); + if (root.is_null()) { + DEBUGT("{}, null root", t, root.get_type()); + return base_iertr::now(); + } + DEBUGT("{} ...", t, root.get_type()); + return omaptree_do_clear(t, std::move(root) + ).si_then([FNAME, &t](auto root) { + DEBUGT("{} done", t, root.get_type()); + return base_iertr::now(); + }); +} + +SeaStore::base_iertr::future<> +SeaStore::Shard::omaptree_clear( + Transaction& t, + omap_root_t&& root, + Onode& onode) +{ + LOG_PREFIX(SeaStoreS::omaptree_clear); + if (root.is_null()) { + DEBUGT("{}, null root", t, root.get_type()); + return base_iertr::now(); + } + DEBUGT("{} ...", t, root.get_type()); + return omaptree_do_clear(t, std::move(root) + ).si_then([&t, &onode, FNAME](auto root) { + assert(root.is_null()); + assert(root.must_update()); + if (root.get_type() == omap_type_t::XATTR) { + onode.update_xattr_root(t, root); + } else { + assert(root.get_type() == omap_type_t::OMAP); + onode.update_omap_root(t, root); + } + DEBUGT("{} done", t, root.get_type()); + }); +} + SeaStore::Shard::tm_ret SeaStore::Shard::_remove( internal_context_t &ctx, OnodeRef &onode) { - return _remove_omaps( - ctx, + return omaptree_clear_no_onode( + *ctx.transaction, onode->get_layout().omap_root.get( onode->get_metadata_hint(device->get_block_size())) ).si_then([this, &ctx, &onode] { - return _remove_omaps( - ctx, + return omaptree_clear_no_onode( + *ctx.transaction, onode->get_layout().xattr_root.get( onode->get_metadata_hint(device->get_block_size()))); }).si_then([this, &ctx, &onode] { - return _remove_omaps( - ctx, + return omaptree_clear_no_onode( + *ctx.transaction, onode->get_layout().log_root.get( onode->get_metadata_hint(device->get_block_size()))); }).si_then([this, &ctx, &onode] { @@ -2338,21 +2381,10 @@ SeaStore::Shard::_omap_clear( ).si_then([this, &ctx, &onode] { auto root = onode->get_layout().omap_root.get( onode->get_metadata_hint(device->get_block_size())); - if (root.is_null()) { - return base_iertr::now(); - } - return seastar::do_with( - BtreeOMapManager(*transaction_manager), + return omaptree_clear( + *ctx.transaction, std::move(root), - [&ctx, &onode](auto &omap_manager, auto &root) - { - return omap_manager.omap_clear(root, *ctx.transaction - ).si_then([&ctx, &onode, &root] { - assert(root.is_null()); - assert(root.must_update()); - onode->update_omap_root(*ctx.transaction, root); - }); - }); + *onode); }); } @@ -2575,27 +2607,14 @@ SeaStore::Shard::_rmattrs( internal_context_t &ctx, OnodeRef &onode) { - LOG_PREFIX(SeaStoreS::_rmattrs); - DEBUGT("onode={}", *ctx.transaction, *onode); onode->clear_object_info(*ctx.transaction); onode->clear_snapset(*ctx.transaction); auto root = onode->get_layout().xattr_root.get( onode->get_metadata_hint(device->get_block_size())); - if (root.is_null()) { - return base_iertr::now(); - } - return seastar::do_with( - BtreeOMapManager(*transaction_manager), + return omaptree_clear( + *ctx.transaction, std::move(root), - [&ctx, &onode](auto &omap_manager, auto &root) - { - return omap_manager.omap_clear(root, *ctx.transaction - ).si_then([&ctx, &onode, &root] { - assert(root.is_null()); - assert(root.must_update()); - onode->update_xattr_root(*ctx.transaction, root); - }); - }); + *onode); } SeaStore::Shard::tm_ret diff --git a/src/crimson/os/seastore/seastore.h b/src/crimson/os/seastore/seastore.h index 75a7bf7ff75d3..2bc4f925e75ce 100644 --- a/src/crimson/os/seastore/seastore.h +++ b/src/crimson/os/seastore/seastore.h @@ -414,9 +414,6 @@ public: std::vector &onodes, ceph::os::Transaction::iterator &i); - tm_ret _remove_omaps( - internal_context_t &ctx, - omap_root_t &&omap_root); tm_ret _remove( internal_context_t &ctx, OnodeRef &onode); @@ -515,6 +512,23 @@ public: lat.sample_sum += std::chrono::duration_cast(dur).count(); } + /* + * omaptree interfaces + */ + + base_iertr::future omaptree_do_clear( + Transaction& t, + omap_root_t&& root); + + base_iertr::future<> omaptree_clear_no_onode( + Transaction& t, + omap_root_t&& root); + + base_iertr::future<> omaptree_clear( + Transaction& t, + omap_root_t&& root, + Onode& onode); + private: std::string root; Device* device; -- 2.39.5