From dfba3530aacac1f8ff3d6d4269f5be530757c621 Mon Sep 17 00:00:00 2001 From: Adam Emerson Date: Thu, 17 Aug 2023 14:39:15 -0400 Subject: [PATCH] neorados/test: Support erasure coded pools The test framework in common test can now support erasure-coded pools and be more easily extended generally. Signed-off-by: Adam Emerson --- src/test/neorados/common_tests.cc | 42 ++++++++++++++++++++++++++++++ src/test/neorados/common_tests.h | 43 ++++++++++++++++++++++++++----- 2 files changed, 78 insertions(+), 7 deletions(-) diff --git a/src/test/neorados/common_tests.cc b/src/test/neorados/common_tests.cc index 6f274551d95e6..fa16f05ec877c 100644 --- a/src/test/neorados/common_tests.cc +++ b/src/test/neorados/common_tests.cc @@ -30,3 +30,45 @@ std::string get_temp_pool_name(std::string_view prefix) static auto num = 1ull; return fmt::format("{}{}-{}-{}", prefix, hostname, getpid(), num++); } + + +asio::awaitable NeoRadosECTest::create_pool() { + // Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110913 + std::vector profile_set = { + fmt::format( + R"({{"prefix": "osd erasure-code-profile set", "name": "testprofile-{}", )" + R"( "profile": [ "k=2", "m=1", "crush-failure-domain=osd"]}})", + pool_name()) + }; + co_await rados().mon_command(std::move(profile_set), {}, nullptr, nullptr, + asio::use_awaitable); + std::vector pool_create = { + fmt::format( + R"({{"prefix": "osd pool create", "pool": "{}", "pool_type":"erasure", )" + R"("pg_num":8, "pgp_num":8, "erasure_code_profile":"testprofile-{}"}})", + pool_name(), pool_name()) + }; + auto c = rados().mon_command(std::move(pool_create), {}, nullptr, nullptr, + asio::use_awaitable); + co_await std::move(c); + + co_return co_await rados().lookup_pool(pool_name(), asio::use_awaitable); +} + +asio::awaitable NeoRadosECTest::clean_pool() { + co_await rados().delete_pool(pool().get_pool(), asio::use_awaitable); + std::vector profile_rm = { + fmt::format( + R"({{"prefix": "osd erasure-code-profile rm", "name": "testprofile-{}"}})", + pool_name()) + }; + co_await rados().mon_command(std::move(profile_rm), {}, nullptr, nullptr, asio::use_awaitable); + std::vector rule_rm = { + fmt::format( + R"({{"prefix": "osd crush rule rm", "name":"{}"}})", + pool_name()) + }; + co_await rados().mon_command(std::move(rule_rm), {}, nullptr, nullptr, + asio::use_awaitable); + co_return; +} diff --git a/src/test/neorados/common_tests.h b/src/test/neorados/common_tests.h index 7f429f27ebb02..46e3a13e51c5a 100644 --- a/src/test/neorados/common_tests.h +++ b/src/test/neorados/common_tests.h @@ -219,7 +219,9 @@ public: /// CoTestBody has access to `rados`, a `neorados::RADOS` handle, and /// `pool`, a `neorados::IOContext` representing a pool that will be /// destroyed when the test exits. -class NeoRadosTest : public CoroTest { +/// +/// Derived classes must define `create_pool()` and `clean_pool()`. +class NeoRadosTestBase : public CoroTest { private: const std::string prefix_{std::string{"test framework "} + testing::UnitTest::GetInstance()-> @@ -227,11 +229,14 @@ private: std::string{": "}}; std::optional rados_; + neorados::IOContext pool_; const std::string pool_name_ = get_temp_pool_name( testing::UnitTest::GetInstance()->current_test_info()->name()); - neorados::IOContext pool_; std::unique_ptr dpp_; + virtual boost::asio::awaitable create_pool() = 0; + virtual boost::asio::awaitable clean_pool() = 0; + protected: /// \brief Return reference to RADOS @@ -290,21 +295,45 @@ public: rados_ = co_await neorados::RADOS::Builder{} .build(asio_context, boost::asio::use_awaitable); dpp_ = std::make_unique(rados().cct(), 0, prefix().data()); - pool_.set_pool(co_await create_pool(rados(), pool_name(), - boost::asio::use_awaitable)); + pool_.set_pool(co_await create_pool()); co_return; } - ~NeoRadosTest() override = default; + ~NeoRadosTestBase() override = default; /// \brief Delete pool used for testing boost::asio::awaitable CoTearDown() override { - co_await rados().delete_pool(pool().get_pool(), - boost::asio::use_awaitable); + co_await clean_pool(); co_return; } }; +/// \brief C++20 coroutine test harness for NeoRados on normal pools +/// +/// The supplied pool is not erasure coded. +class NeoRadosTest : public NeoRadosTestBase { +private: + boost::asio::awaitable create_pool() override { + co_return co_await ::create_pool(rados(), pool_name(), + boost::asio::use_awaitable); + } + + boost::asio::awaitable clean_pool() override { + co_await rados().delete_pool(pool().get_pool(), + boost::asio::use_awaitable); + } +}; + +/// \brief C++20 coroutine test harness for NeoRados on erasure-coded +/// pools +/// +/// The supplied pool is erasure coded +class NeoRadosECTest : public NeoRadosTestBase { +private: + boost::asio::awaitable create_pool() override; + boost::asio::awaitable clean_pool() override; +}; + /// \brief Helper macro for defining coroutine tests with a fixture /// /// Defines a test using a coroutine fixture for -- 2.39.5