]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/onode_manager: erase onodes from the OnodeTree at the moment...
authorxuxuehan <xuxuehan@qianxin.com>
Fri, 26 May 2023 07:55:44 +0000 (15:55 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Thu, 10 Aug 2023 05:14:22 +0000 (13:14 +0800)
Signed-off-by: xuxuehan <xuxuehan@qianxin.com>
src/crimson/os/seastore/onode.h
src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.cc
src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h
src/test/crimson/seastore/onode_tree/test_fltree_onode_manager.cc
src/test/crimson/seastore/test_object_data_handler.cc

index 952dd9cca34d11f471a054ebed502f00877f18bc..069daa3df5b56ba231128a728f152fa177908664 100644 (file)
@@ -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;
index 8d75f9fa837ce7f1c5a7c0f93e9fa727e7634c5d..ba78cbf0b0b320768791f08e557ee3ddcf689a03 100644 (file)
@@ -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<FLTreeOnode&>(*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<FLTreeOnode&>(*onode);
   flonode.mark_delete();
-  return erase_onode_iertr::now();
+  return tree.erase(trans, flonode);
 }
 
 FLTreeOnodeManager::list_onodes_ret FLTreeOnodeManager::list_onodes(
index 0367b823f361bbafe3b860cb849320de501cf6a0..09998fbfaea9f04da2deb73a5f2c4d189829b655 100644 (file)
@@ -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<onode_layout_t>();
index 64afe1247caacb2ff04d1fb0708f831cd5885d73..83701701600f6085caf6b66c8e76bab1e1144432 100644 (file)
@@ -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();
     });
   }
index 11b9ed0e6cca7bbd5e66dffc09e429ac0dcde582..abbe74457381704e8c0205311cc8224951badfbc 100644 (file)
@@ -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;