From: Samuel Just Date: Mon, 8 Mar 2021 20:38:01 +0000 (-0800) Subject: crimson/seastore/onode_tree: add FLTreeOnodeManager unittest X-Git-Tag: v17.1.0~2678^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=014b4fc6e49d7f645ed26b49e2aa065f5657899d;p=ceph.git crimson/seastore/onode_tree: add FLTreeOnodeManager unittest Signed-off-by: Samuel Just --- 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 48aeee7b98e21..39cdf5ab91c72 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 @@ -116,5 +116,6 @@ public: ~FLTreeOnodeManager(); }; +using FLTreeOnodeManagerRef = std::unique_ptr; } diff --git a/src/test/crimson/seastore/onode_tree/CMakeLists.txt b/src/test/crimson/seastore/onode_tree/CMakeLists.txt index 3a5eb037e3cbd..632e16b703571 100644 --- a/src/test/crimson/seastore/onode_tree/CMakeLists.txt +++ b/src/test/crimson/seastore/onode_tree/CMakeLists.txt @@ -4,3 +4,10 @@ add_executable(unittest-staged-fltree add_ceph_unittest(unittest-staged-fltree) target_link_libraries(unittest-staged-fltree crimson-seastore) + +add_executable(unittest-fltree-onode-manager + test_fltree_onode_manager.cc + ../../gtest_seastar.cc) +add_ceph_unittest(unittest-fltree-onode-manager) +target_link_libraries(unittest-fltree-onode-manager + crimson-seastore) 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 new file mode 100644 index 0000000000000..b48aa0fa32a98 --- /dev/null +++ b/src/test/crimson/seastore/onode_tree/test_fltree_onode_manager.cc @@ -0,0 +1,135 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include +#include +#include + +#include "test/crimson/gtest_seastar.h" + +#include "test/crimson/seastore/transaction_manager_test_state.h" + +#include "crimson/os/futurized_collection.h" +#include "crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h" + +using namespace crimson; +using namespace crimson::os; +using namespace crimson::os::seastore; +using namespace crimson::os::seastore::onode; +using CTransaction = ceph::os::Transaction; +using namespace std; + +namespace { + [[maybe_unused]] seastar::logger& logger() { + return crimson::get_logger(ceph_subsys_test); + } +} + +ghobject_t make_oid(unsigned i) { + stringstream ss; + ss << "object_" << i; + auto ret = ghobject_t( + hobject_t( + sobject_t(ss.str(), CEPH_NOSNAP))); + ret.hobj.nspace = "asdf"; + return ret; +} + +struct fltree_onode_manager_test_t : + public seastar_test_suite_t, + TMTestState { + FLTreeOnodeManagerRef manager; + + seastar::future<> set_up_fut() final { + return tm_setup(); + } + + seastar::future<> tear_down_fut() final { + return tm_teardown(); + } + + + virtual void _init() final { + TMTestState::_init(); + manager.reset(new FLTreeOnodeManager(*tm)); + } + + virtual void _destroy() final { + manager.reset(); + TMTestState::_destroy(); + } + + virtual seastar::future<> _mkfs() final { + return TMTestState::_mkfs( + ).then([this] { + return seastar::do_with( + tm->create_transaction(), + [this](auto &t) { + return manager->mkfs(*t + ).safe_then([this, &t] { + return tm->submit_transaction(std::move(t)); + }).handle_error( + crimson::ct_error::assert_all{ + "Invalid error in _mkfs" + } + ); + }); + }); + } + + template + void with_onodes_write( + std::vector oids, + F &&f) { + auto t = tm->create_transaction(); + auto onodes = manager->get_or_create_onodes( + *t, + oids).unsafe_get0(); + std::invoke(f, *t, onodes); + manager->write_dirty( + *t, + onodes + ).unsafe_get0(); + tm->submit_transaction(std::move(t)).unsafe_get0(); + } + + template + void with_onodes_write_range( + unsigned start, + unsigned end, + unsigned stride, + F &&f) { + std::vector oids; + for (unsigned i = start; i < end; i += stride) { + oids.emplace_back(make_oid(i)); + } + with_onodes_write(std::move(oids), std::forward(f)); + } + + template + void with_onode_write(unsigned i, F &&f) { + with_onodes_write_range( + i, + i + 1, + 1, [this, f=std::forward(f)](auto &t, auto &onodes) { + assert(onodes.size() == 1); + std::invoke(f, t, *onodes[0]); + }); + } + + fltree_onode_manager_test_t() {} +}; + +TEST_F(fltree_onode_manager_test_t, touch) +{ + run_async([this] { + with_onode_write(0, [](auto &t, auto &onode) { + onode.get_mutable_layout(t); + }); + /* Disabled pending fix + with_onode_write(0, [](auto &t, auto &onode) { + onode.get_mutable_layout(t); + }); + */ + }); +}