From 7fe2323d24b5f08d8f478c2d3da677867fb1a8fa Mon Sep 17 00:00:00 2001 From: luo rixin Date: Wed, 7 Feb 2024 11:48:30 +0800 Subject: [PATCH] test/crimson: construct app_template with smp_opts imported from ctest Co-authored-by: Kefu Chai Signed-off-by: luo rixin --- src/test/crimson/ctest_utils.h | 78 +++++++++++++++++++ src/test/crimson/seastar_runner.h | 4 +- src/test/crimson/test_alien_echo.cc | 3 +- .../crimson/test_alienstore_thread_pool.cc | 3 +- src/test/crimson/test_buffer.cc | 3 +- src/test/crimson/test_config.cc | 3 +- src/test/crimson/test_messenger.cc | 3 +- src/test/crimson/test_messenger_thrash.cc | 3 +- src/test/crimson/test_monc.cc | 3 +- src/test/crimson/test_perfcounters.cc | 3 +- src/test/crimson/test_socket.cc | 3 +- 11 files changed, 99 insertions(+), 10 deletions(-) create mode 100644 src/test/crimson/ctest_utils.h diff --git a/src/test/crimson/ctest_utils.h b/src/test/crimson/ctest_utils.h new file mode 100644 index 0000000000000..9bbd081dc186d --- /dev/null +++ b/src/test/crimson/ctest_utils.h @@ -0,0 +1,78 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +struct ctest_resource { + int id; + int slots; + ctest_resource(int id, int slots) : id(id), slots(slots) {} +}; + +static std::vector parse_ctest_resources(const std::string& resource_spec) { + std::vector resources; + boost::split(resources, resource_spec, boost::is_any_of(";")); + std::regex res_regex("id:([0-9]+),slots:([0-9]+)"); + std::vector ctest_resources; + for (auto& resource : resources) { + std::smatch matched; + if (std::regex_match(resource, matched, res_regex)) { + int id = std::stoi(matched[1].str()); + int slots = std::stoi(matched[2].str()); + ctest_resources.emplace_back(id, slots); + } + } + return ctest_resources; +} + +static std::optional get_cpuset_from_ctest_resource_group() { + int nr_groups = 0; + auto group_count = std::getenv("CTEST_RESOURCE_GROUP_COUNT"); + if (group_count != nullptr) { + nr_groups = std::stoi(group_count); + } else { + return {}; + } + + seastar::resource::cpuset cpuset; + for (int num = 0; num < nr_groups; num++) { + std::string resource_type_name; + fmt::format_to(std::back_inserter(resource_type_name), "CTEST_RESOURCE_GROUP_{}", num); + // only a single resource type is supported for now + std::string resource_type = std::getenv(resource_type_name.data()); + if (resource_type == "cpus") { + std::transform(resource_type.begin(), resource_type.end(), resource_type.begin(), ::toupper); + std::string resource_group; + fmt::format_to(std::back_inserter(resource_group), "CTEST_RESOURCE_GROUP_{}_{}", num, resource_type); + std::string resource_spec = std::getenv(resource_group.data()); + for (auto& resource : parse_ctest_resources(resource_spec)) { + // each id has a single cpu slot + cpuset.insert(resource.id); + } + } else { + fmt::print(std::cerr, "unsupported resource type: {}", resource_type); + } + } + return cpuset; +} + +static seastar::app_template::seastar_options get_smp_opts_from_ctest() { + seastar::app_template::seastar_options opts; + auto cpuset = get_cpuset_from_ctest_resource_group(); + if (cpuset) { + opts.smp_opts.cpuset.set_value(*cpuset); + } + return opts; +} diff --git a/src/test/crimson/seastar_runner.h b/src/test/crimson/seastar_runner.h index 58d3f8119e669..63cc50d9f059d 100644 --- a/src/test/crimson/seastar_runner.h +++ b/src/test/crimson/seastar_runner.h @@ -13,6 +13,8 @@ #include #include +#include "test/crimson/ctest_utils.h" + struct SeastarRunner { static constexpr eventfd_t APP_RUNNING = 1; static constexpr eventfd_t APP_NOT_RUN = 2; @@ -26,7 +28,7 @@ struct SeastarRunner { bool begin_signaled = false; SeastarRunner() : - begin_fd{seastar::file_desc::eventfd(0, 0)} {} + app{get_smp_opts_from_ctest()}, begin_fd{seastar::file_desc::eventfd(0, 0)} {} ~SeastarRunner() {} diff --git a/src/test/crimson/test_alien_echo.cc b/src/test/crimson/test_alien_echo.cc index 8bef5e6517b03..f6b23305ce5c1 100644 --- a/src/test/crimson/test_alien_echo.cc +++ b/src/test/crimson/test_alien_echo.cc @@ -8,6 +8,7 @@ #include "crimson/net/Connection.h" #include "crimson/net/Dispatcher.h" #include "crimson/net/Messenger.h" +#include "test/crimson/ctest_utils.h" #include #include @@ -266,7 +267,7 @@ int main(int argc, char** argv) } auto count = vm["count"].as(); - seastar::app_template app; + seastar::app_template app{get_smp_opts_from_ctest()}; SeastarContext sc; auto job = sc.with_seastar([&] { auto fut = seastar::alien::submit_to(app.alien(), 0, [addr, role, count] { diff --git a/src/test/crimson/test_alienstore_thread_pool.cc b/src/test/crimson/test_alienstore_thread_pool.cc index dbeed26cd7dbf..5f8e2d1b707c5 100644 --- a/src/test/crimson/test_alienstore_thread_pool.cc +++ b/src/test/crimson/test_alienstore_thread_pool.cc @@ -6,6 +6,7 @@ #include "crimson/common/config_proxy.h" #include "crimson/os/alienstore/thread_pool.h" #include "include/msgr.h" +#include "test/crimson/ctest_utils.h" using namespace std::chrono_literals; using ThreadPool = crimson::os::ThreadPool; @@ -37,7 +38,7 @@ seastar::future<> test_void_return(ThreadPool& tp) { int main(int argc, char** argv) { - seastar::app_template app; + seastar::app_template app{get_smp_opts_from_ctest()}; return app.run(argc, argv, [] { std::vector args; std::string cluster; diff --git a/src/test/crimson/test_buffer.cc b/src/test/crimson/test_buffer.cc index 64a815bd2764c..61b2785dd607a 100644 --- a/src/test/crimson/test_buffer.cc +++ b/src/test/crimson/test_buffer.cc @@ -3,6 +3,7 @@ #include #include #include "include/buffer.h" +#include "test/crimson/ctest_utils.h" // allocate a foreign buffer on each cpu, collect them all into a bufferlist, // and destruct it on this cpu @@ -36,7 +37,7 @@ seastar::future<> test_foreign_bufferlist() int main(int argc, char** argv) { - seastar::app_template app; + seastar::app_template app{get_smp_opts_from_ctest()}; return app.run(argc, argv, [] { return seastar::now().then( &test_foreign_bufferlist diff --git a/src/test/crimson/test_config.cc b/src/test/crimson/test_config.cc index 7541c0931254a..7b1dddb715ffd 100644 --- a/src/test/crimson/test_config.cc +++ b/src/test/crimson/test_config.cc @@ -6,6 +6,7 @@ #include "common/ceph_argparse.h" #include "common/config_obs.h" #include "crimson/common/config_proxy.h" +#include "test/crimson/ctest_utils.h" using namespace std::literals; using Config = crimson::common::ConfigProxy; @@ -88,7 +89,7 @@ static seastar::future<> test_config() int main(int argc, char** argv) { - seastar::app_template app; + seastar::app_template app{get_smp_opts_from_ctest()}; return app.run(argc, argv, [&] { return test_config().then([] { std::cout << "All tests succeeded" << std::endl; diff --git a/src/test/crimson/test_messenger.cc b/src/test/crimson/test_messenger.cc index a4257224658d1..75bbcd7a64768 100644 --- a/src/test/crimson/test_messenger.cc +++ b/src/test/crimson/test_messenger.cc @@ -29,6 +29,7 @@ #include #include "test_messenger.h" +#include "test/crimson/ctest_utils.h" using namespace std::chrono_literals; namespace bpo = boost::program_options; @@ -3845,7 +3846,7 @@ seastar::future do_test(seastar::app_template& app) int main(int argc, char** argv) { - seastar::app_template app; + seastar::app_template app{get_smp_opts_from_ctest()}; app.add_options() ("verbose,v", bpo::value()->default_value(false), "chatty if true") diff --git a/src/test/crimson/test_messenger_thrash.cc b/src/test/crimson/test_messenger_thrash.cc index f2b1828f1c5a7..28efb60fd5cc4 100644 --- a/src/test/crimson/test_messenger_thrash.cc +++ b/src/test/crimson/test_messenger_thrash.cc @@ -20,6 +20,7 @@ #include "crimson/net/Connection.h" #include "crimson/net/Dispatcher.h" #include "crimson/net/Messenger.h" +#include "test/crimson/ctest_utils.h" using namespace std::chrono_literals; namespace bpo = boost::program_options; @@ -662,7 +663,7 @@ seastar::future do_test(seastar::app_template& app) int main(int argc, char** argv) { - seastar::app_template app; + seastar::app_template app{get_smp_opts_from_ctest()}; app.add_options() ("verbose,v", bpo::value()->default_value(false), "chatty if true"); diff --git a/src/test/crimson/test_monc.cc b/src/test/crimson/test_monc.cc index e60df45257688..c30098fe87f98 100644 --- a/src/test/crimson/test_monc.cc +++ b/src/test/crimson/test_monc.cc @@ -5,6 +5,7 @@ #include "crimson/mon/MonClient.h" #include "crimson/net/Connection.h" #include "crimson/net/Messenger.h" +#include "test/crimson/ctest_utils.h" using Config = crimson::common::ConfigProxy; using MonClient = crimson::mon::Client; @@ -63,7 +64,7 @@ static seastar::future<> test_monc() int main(int argc, char** argv) { - seastar::app_template app; + seastar::app_template app{get_smp_opts_from_ctest()}; return app.run(argc, argv, [&] { return test_monc().then([] { std::cout << "All tests succeeded" << std::endl; diff --git a/src/test/crimson/test_perfcounters.cc b/src/test/crimson/test_perfcounters.cc index 8aecbf911cc90..2b7020a39ae60 100644 --- a/src/test/crimson/test_perfcounters.cc +++ b/src/test/crimson/test_perfcounters.cc @@ -6,6 +6,7 @@ #include "common/Formatter.h" #include "common/perf_counters.h" #include "crimson/common/perf_counters_collection.h" +#include "test/crimson/ctest_utils.h" #include #include @@ -47,7 +48,7 @@ static seastar::future<> test_perfcounters(){ int main(int argc, char** argv) { - seastar::app_template app; + seastar::app_template app{get_smp_opts_from_ctest()}; return app.run(argc, argv, [&] { return test_perfcounters().then([] { std::cout << "All tests succeeded" << std::endl; diff --git a/src/test/crimson/test_socket.cc b/src/test/crimson/test_socket.cc index 2b61196ead8df..ca0677e1e76db 100644 --- a/src/test/crimson/test_socket.cc +++ b/src/test/crimson/test_socket.cc @@ -14,6 +14,7 @@ #include "crimson/net/Errors.h" #include "crimson/net/Fwd.h" #include "crimson/net/Socket.h" +#include "test/crimson/ctest_utils.h" using crimson::common::local_conf; @@ -551,7 +552,7 @@ seastar::future do_test(seastar::app_template& app) int main(int argc, char** argv) { - seastar::app_template app; + seastar::app_template app{get_smp_opts_from_ctest()}; return app.run(argc, argv, [&app] { return do_test(app); }); -- 2.39.5