]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/seastore: integrate and test onode erase to OnodeManager
authorYingxin Cheng <yingxin.cheng@intel.com>
Tue, 27 Apr 2021 02:54:29 +0000 (10:54 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Sat, 8 May 2021 02:04:46 +0000 (10:04 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/onode_manager.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

index 8aecd730360810ab043b90bf44925d161f093848..c7b29148924f084314292b3b394ba38e2382018e 100644 (file)
@@ -27,6 +27,12 @@ public:
   using mkfs_ret = mkfs_ertr::future<>;
   virtual mkfs_ret mkfs(Transaction &t) = 0;
 
+  using contains_onode_ertr = base_ertr;
+  using contains_onode_ret = contains_onode_ertr::future<bool>;
+  virtual contains_onode_ret contains_onode(
+    Transaction &trans,
+    const ghobject_t &hoid) = 0;
+
   using get_onode_ertr = base_ertr::extend<
     crimson::ct_error::enoent>;
   using get_onode_ret = get_onode_ertr::future<
@@ -57,6 +63,12 @@ public:
     Transaction &trans,
     const std::vector<OnodeRef> &onodes) = 0;
 
+  using erase_onode_ertr = base_ertr;
+  using erase_onode_ret = erase_onode_ertr::future<>;
+  virtual erase_onode_ret erase_onode(
+    Transaction &trans,
+    OnodeRef &onode) = 0;
+
   virtual ~OnodeManager() {}
 };
 using OnodeManagerRef = std::unique_ptr<OnodeManager>;
index 7b376c6930760b5fa67e3b3e77bab1606c1cc617..e0b406d81821926cbb71cc4db3322f3289f42683 100644 (file)
@@ -12,6 +12,20 @@ namespace {
 
 namespace crimson::os::seastore::onode {
 
+FLTreeOnodeManager::contains_onode_ret FLTreeOnodeManager::contains_onode(
+  Transaction &trans,
+  const ghobject_t &hoid)
+{
+  return tree.contains(
+    trans, hoid
+  ).handle_error(
+    contains_onode_ertr::pass_further{},
+    crimson::ct_error::assert_all{
+      "Invalid error in FLTreeOnodeManager::contains_onode"
+    }
+  );
+}
+
 FLTreeOnodeManager::get_onode_ret FLTreeOnodeManager::get_onode(
   Transaction &trans,
   const ghobject_t &hoid)
@@ -125,6 +139,15 @@ FLTreeOnodeManager::write_dirty_ret FLTreeOnodeManager::write_dirty(
     );
 }
 
+FLTreeOnodeManager::erase_onode_ret FLTreeOnodeManager::erase_onode(
+  Transaction &trans,
+  OnodeRef &onode)
+{
+  auto &flonode = static_cast<FLTreeOnode&>(*onode);
+  flonode.mark_delete();
+  return erase_onode_ertr::now();
+}
+
 FLTreeOnodeManager::~FLTreeOnodeManager() {}
 
 }
index b2af3c28dd518015957adfb1982ac180a876045c..4146d08d82bc3bdc418f5b224222a272f77921c0 100644 (file)
@@ -55,10 +55,12 @@ struct FLTreeOnode final : Onode, Value {
   };
 
   const onode_layout_t &get_layout() const final {
+    assert(status != status_t::DELETED);
     return *read_payload<onode_layout_t>();
   }
 
   onode_layout_t &get_mutable_layout(Transaction &t) final {
+    assert(status != status_t::DELETED);
     auto p = prepare_mutate_payload<
       onode_layout_t,
       Recorder>(t);
@@ -67,6 +69,7 @@ struct FLTreeOnode final : Onode, Value {
   };
 
   void populate_recorder(Transaction &t) {
+    assert(status == status_t::MUTATED);
     auto p = prepare_mutate_payload<
       onode_layout_t,
       Recorder>(t);
@@ -77,6 +80,11 @@ struct FLTreeOnode final : Onode, Value {
     status = status_t::STABLE;
   }
 
+  void mark_delete() {
+    assert(status != status_t::DELETED);
+    status = status_t::DELETED;
+  }
+
   ~FLTreeOnode() final {}
 };
 
@@ -100,6 +108,10 @@ public:
     );
   }
 
+  contains_onode_ret contains_onode(
+    Transaction &trans,
+    const ghobject_t &hoid) final;
+
   get_onode_ret get_onode(
     Transaction &trans,
     const ghobject_t &hoid) final;
@@ -116,6 +128,10 @@ public:
     Transaction &trans,
     const std::vector<OnodeRef> &onodes) final;
 
+  erase_onode_ret erase_onode(
+    Transaction &trans,
+    OnodeRef &onode) final;
+
   ~FLTreeOnodeManager();
 };
 using FLTreeOnodeManagerRef = std::unique_ptr<FLTreeOnodeManager>;
index 455a4c4df12e963625b45c69d54b29d884e24064..9c3b4f1832a19d9cf02dbf51af4476e7418b7a9d 100644 (file)
@@ -128,6 +128,15 @@ struct fltree_onode_manager_test_t
     });
   }
 
+  void validate_erased(iterator_t& it) {
+    with_transaction([this, &it] (auto& t) {
+      auto p_kv = *it;
+      auto exist = manager->contains_onode(
+          t, p_kv->key).unsafe_get0();
+      ceph_assert(exist == false);
+    });
+  }
+
   template <typename F>
   void with_onodes_process(
       iterator_t& start, iterator_t& end, F&& f) {
@@ -176,6 +185,18 @@ struct fltree_onode_manager_test_t
     });
   }
 
+  void validate_erased(
+      iterator_t& start, iterator_t& end) {
+    with_onodes_process(start, end,
+        [this] (auto& t, auto& oids, auto& items) {
+      for (auto& oid : oids) {
+        auto exist = manager->contains_onode(
+            t, oid).unsafe_get0();
+        ceph_assert(exist == false);
+      }
+    });
+  }
+
   fltree_onode_manager_test_t() {}
 };
 
@@ -193,6 +214,12 @@ TEST_F(fltree_onode_manager_test_t, 1_single)
       item.modify(t, onode);
     });
     validate_onode(iter);
+
+    with_onode_write(iter, [this](auto& t, auto& onode, auto& item) {
+      OnodeRef onode_ref = &onode;
+      manager->erase_onode(t, onode_ref).unsafe_get0();
+    });
+    validate_erased(iter);
   });
 }
 
@@ -225,5 +252,19 @@ TEST_F(fltree_onode_manager_test_t, 2_synthetic)
       item.modify(t, onode);
     });
     validate_onodes(start, end);
+
+    pool.shuffle();
+    rd_start = pool.random_begin();
+    rd_end = rd_start + 50;
+    with_onodes_write(rd_start, rd_end,
+        [this](auto& t, auto& onode, auto& item) {
+      OnodeRef onode_ref = &onode;
+      manager->erase_onode(t, onode_ref).unsafe_get0();
+    });
+    validate_erased(rd_start, rd_end);
+    pool.erase_from_random(rd_start, rd_end);
+    start = pool.begin();
+    end = pool.end();
+    validate_onodes(start, end);
   });
 }