From e5ee75ee85a7c6f5de6823986eeb30fe44349c47 Mon Sep 17 00:00:00 2001 From: xuxuehan Date: Fri, 26 May 2023 15:55:44 +0800 Subject: [PATCH] crimson/os/seastore/onode_manager: erase onodes from the OnodeTree at the moment of erase_onode Signed-off-by: xuxuehan --- src/crimson/os/seastore/onode.h | 1 + .../staged-fltree/fltree_onode_manager.cc | 13 ++++++++----- .../staged-fltree/fltree_onode_manager.h | 3 +++ .../onode_tree/test_fltree_onode_manager.cc | 6 +++++- .../crimson/seastore/test_object_data_handler.cc | 3 +++ 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/crimson/os/seastore/onode.h b/src/crimson/os/seastore/onode.h index 952dd9cca34d1..069daa3df5b56 100644 --- a/src/crimson/os/seastore/onode.h +++ b/src/crimson/os/seastore/onode.h @@ -62,6 +62,7 @@ public: default_metadata_range(dmr) {} + virtual bool is_alive() const = 0; virtual const onode_layout_t &get_layout() const = 0; virtual onode_layout_t &get_mutable_layout(Transaction &t) = 0; virtual ~Onode() = default; diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.cc b/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.cc index 8d75f9fa837ce..ba78cbf0b0b32 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.cc +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.cc @@ -93,16 +93,19 @@ FLTreeOnodeManager::write_dirty_ret FLTreeOnodeManager::write_dirty( { return trans_intr::do_for_each( onodes, - [this, &trans](auto &onode) -> eagain_ifuture<> { + [&trans](auto &onode) -> eagain_ifuture<> { + if (!onode) { + return eagain_iertr::make_ready_future<>(); + } auto &flonode = static_cast(*onode); + if (!flonode.is_alive()) { + return eagain_iertr::make_ready_future<>(); + } switch (flonode.status) { case FLTreeOnode::status_t::MUTATED: { flonode.populate_recorder(trans); return eagain_iertr::make_ready_future<>(); } - case FLTreeOnode::status_t::DELETED: { - return tree.erase(trans, flonode); - } case FLTreeOnode::status_t::STABLE: { return eagain_iertr::make_ready_future<>(); } @@ -118,7 +121,7 @@ FLTreeOnodeManager::erase_onode_ret FLTreeOnodeManager::erase_onode( { auto &flonode = static_cast(*onode); flonode.mark_delete(); - return erase_onode_iertr::now(); + return tree.erase(trans, flonode); } FLTreeOnodeManager::list_onodes_ret FLTreeOnodeManager::list_onodes( diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h b/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h index 0367b823f361b..09998fbfaea9f 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h @@ -70,6 +70,9 @@ struct FLTreeOnode final : Onode, Value { } }; + bool is_alive() const { + return status != status_t::DELETED; + } const onode_layout_t &get_layout() const final { assert(status != status_t::DELETED); return *read_payload(); diff --git a/src/test/crimson/seastore/onode_tree/test_fltree_onode_manager.cc b/src/test/crimson/seastore/onode_tree/test_fltree_onode_manager.cc index 64afe1247caac..83701701600f6 100644 --- a/src/test/crimson/seastore/onode_tree/test_fltree_onode_manager.cc +++ b/src/test/crimson/seastore/onode_tree/test_fltree_onode_manager.cc @@ -120,7 +120,11 @@ struct fltree_onode_manager_test_t }).unsafe_get0(); std::invoke(f, t, *onode, p_kv->value); with_trans_intr(t, [&](auto &t) { - return manager->write_dirty(t, {onode}); + if (onode->is_alive()) { + return manager->write_dirty(t, {onode}); + } else { + return OnodeManager::write_dirty_iertr::now(); + } }).unsafe_get0(); }); } diff --git a/src/test/crimson/seastore/test_object_data_handler.cc b/src/test/crimson/seastore/test_object_data_handler.cc index 11b9ed0e6cca7..abbe744573817 100644 --- a/src/test/crimson/seastore/test_object_data_handler.cc +++ b/src/test/crimson/seastore/test_object_data_handler.cc @@ -34,6 +34,9 @@ public: dirty = true; return layout; } + bool is_alive() const { + return true; + } bool is_dirty() const { return dirty; } laddr_t get_hint() const final {return L_ADDR_MIN; } ~TestOnode() final = default; -- 2.39.5