From: Yingxin Cheng Date: Tue, 27 Apr 2021 02:54:29 +0000 (+0800) Subject: crimson/seastore: integrate and test onode erase to OnodeManager X-Git-Tag: v17.1.0~2016^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e6208e6e1ef58a005a596a39ae57cafc63bc461f;p=ceph.git crimson/seastore: integrate and test onode erase to OnodeManager Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/os/seastore/onode_manager.h b/src/crimson/os/seastore/onode_manager.h index 8aecd7303608..c7b29148924f 100644 --- a/src/crimson/os/seastore/onode_manager.h +++ b/src/crimson/os/seastore/onode_manager.h @@ -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; + 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 &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; 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 7b376c693076..e0b406d81821 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 @@ -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(*onode); + flonode.mark_delete(); + return erase_onode_ertr::now(); +} + FLTreeOnodeManager::~FLTreeOnodeManager() {} } 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 b2af3c28dd51..4146d08d82bc 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 @@ -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 &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 &onodes) final; + erase_onode_ret erase_onode( + Transaction &trans, + OnodeRef &onode) final; + ~FLTreeOnodeManager(); }; using FLTreeOnodeManagerRef = std::unique_ptr; 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 455a4c4df12e..9c3b4f1832a1 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 @@ -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 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); }); }