From: Yingxin Cheng Date: Thu, 29 Apr 2021 02:20:05 +0000 (+0800) Subject: crimson/seastore: integrate and test oid list to OnodeManager X-Git-Tag: v17.1.0~2016^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=022532645d459b637535f1b7943c791656d9d103;p=ceph.git crimson/seastore: integrate and test oid list 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 c7b29148924f0..95045bc411ab2 100644 --- a/src/crimson/os/seastore/onode_manager.h +++ b/src/crimson/os/seastore/onode_manager.h @@ -69,6 +69,15 @@ public: Transaction &trans, OnodeRef &onode) = 0; + using list_onodes_ertr = base_ertr; + using list_onodes_bare_ret = std::tuple, ghobject_t>; + using list_onodes_ret = list_onodes_ertr::future; + virtual list_onodes_ret list_onodes( + Transaction &trans, + const ghobject_t& start, + const ghobject_t& end, + uint64_t limit) = 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 e0b406d818219..82a12eb1d0670 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 @@ -148,6 +148,55 @@ FLTreeOnodeManager::erase_onode_ret FLTreeOnodeManager::erase_onode( return erase_onode_ertr::now(); } +FLTreeOnodeManager::list_onodes_ret FLTreeOnodeManager::list_onodes( + Transaction &trans, + const ghobject_t& start, + const ghobject_t& end, + uint64_t limit) +{ + return tree.lower_bound(trans, start + ).safe_then([this, &trans, end, limit] (auto&& cursor) { + using crimson::os::seastore::onode::full_key_t; + return seastar::do_with( + limit, + std::move(cursor), + list_onodes_bare_ret(), + [this, &trans, end] (auto& to_list, auto& current_cursor, auto& ret) { + using get_next_ertr = typename OnodeTree::btree_ertr; + return crimson::do_until( + [this, &trans, end, &to_list, ¤t_cursor, &ret] () mutable + -> get_next_ertr::future { + if (current_cursor.is_end() || + current_cursor.get_ghobj() >= end) { + std::get<1>(ret) = end; + return seastar::make_ready_future(true); + } + if (to_list == 0) { + std::get<1>(ret) = current_cursor.get_ghobj(); + return seastar::make_ready_future(true); + } + std::get<0>(ret).emplace_back(current_cursor.get_ghobj()); + return tree.get_next(trans, current_cursor + ).safe_then([&to_list, ¤t_cursor] (auto&& next_cursor) mutable { + // we intentionally hold the current_cursor during get_next() to + // accelerate tree lookup. + --to_list; + current_cursor = next_cursor; + return seastar::make_ready_future(false); + }); + }).safe_then([&ret] () mutable { + return seastar::make_ready_future( + std::move(ret)); + }); + }); + }).handle_error( + list_onodes_ertr::pass_further{}, + crimson::ct_error::assert_all{ + "Invalid error in FLTreeOnodeManager::list_onodes" + } + ); +} + 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 4146d08d82bc3..2a24dc1829068 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 @@ -132,6 +132,12 @@ public: Transaction &trans, OnodeRef &onode) final; + list_onodes_ret list_onodes( + Transaction &trans, + const ghobject_t& start, + const ghobject_t& end, + uint64_t limit) 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 c9fc0ae8d001b..9a314dcb5f94f 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 @@ -197,6 +197,26 @@ struct fltree_onode_manager_test_t }); } + static constexpr uint64_t LIST_LIMIT = 10; + void validate_list_onodes(KVPool& pool) { + with_onodes_process(pool.begin(), pool.end(), + [this] (auto& t, auto& oids, auto& items) { + std::vector listed_oids; + auto start = ghobject_t(); + auto end = ghobject_t::get_max(); + assert(start < end); + assert(start < oids[0]); + assert(oids[0] < end); + while (start != end) { + auto [list_ret, list_end] = manager->list_onodes( + t, start, end, LIST_LIMIT).unsafe_get0(); + listed_oids.insert(listed_oids.end(), list_ret.begin(), list_ret.end()); + start = list_end; + } + ceph_assert(oids.size() == listed_oids.size()); + }); + } + fltree_onode_manager_test_t() {} }; @@ -215,6 +235,8 @@ TEST_F(fltree_onode_manager_test_t, 1_single) }); validate_onode(iter); + validate_list_onodes(pool); + with_onode_write(iter, [this](auto& t, auto& onode, auto& item) { OnodeRef onode_ref = &onode; manager->erase_onode(t, onode_ref).unsafe_get0(); @@ -236,6 +258,8 @@ TEST_F(fltree_onode_manager_test_t, 2_synthetic) }); validate_onodes(start, end); + validate_list_onodes(pool); + auto rd_start = pool.random_begin(); auto rd_end = rd_start + 50; with_onodes_write(rd_start, rd_end, @@ -266,5 +290,7 @@ TEST_F(fltree_onode_manager_test_t, 2_synthetic) start = pool.begin(); end = pool.end(); validate_onodes(start, end); + + validate_list_onodes(pool); }); }