--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#pragma once
+
+#include <cstdlib>
+#include <iostream>
+#include <optional>
+#include <regex>
+#include <string>
+#include <vector>
+
+#include <boost/algorithm/string.hpp>
+#include <fmt/format.h>
+#include <seastar/core/resource.hh>
+#include <seastar/core/app-template.hh>
+
+struct ctest_resource {
+ int id;
+ int slots;
+ ctest_resource(int id, int slots) : id(id), slots(slots) {}
+};
+
+static std::vector<ctest_resource> parse_ctest_resources(const std::string& resource_spec) {
+ std::vector<std::string> resources;
+ boost::split(resources, resource_spec, boost::is_any_of(";"));
+ std::regex res_regex("id:([0-9]+),slots:([0-9]+)");
+ std::vector<ctest_resource> 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<seastar::resource::cpuset> 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;
+}
#include <seastar/core/alien.hh>
#include <seastar/core/thread.hh>
+#include "test/crimson/ctest_utils.h"
+
struct SeastarRunner {
static constexpr eventfd_t APP_RUNNING = 1;
static constexpr eventfd_t APP_NOT_RUN = 2;
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() {}
#include "crimson/net/Connection.h"
#include "crimson/net/Dispatcher.h"
#include "crimson/net/Messenger.h"
+#include "test/crimson/ctest_utils.h"
#include <seastar/core/alien.hh>
#include <seastar/core/app-template.hh>
}
auto count = vm["count"].as<unsigned>();
- 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] {
#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;
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<const char*> args;
std::string cluster;
#include <seastar/core/future-util.hh>
#include <seastar/core/reactor.hh>
#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
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
#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;
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;
#include <seastar/core/with_timeout.hh>
#include "test_messenger.h"
+#include "test/crimson/ctest_utils.h"
using namespace std::chrono_literals;
namespace bpo = boost::program_options;
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<bool>()->default_value(false),
"chatty if true")
#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;
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<bool>()->default_value(false),
"chatty if true");
#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;
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;
#include "common/Formatter.h"
#include "common/perf_counters.h"
#include "crimson/common/perf_counters_collection.h"
+#include "test/crimson/ctest_utils.h"
#include <seastar/core/app-template.hh>
#include <seastar/core/sharded.hh>
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;
#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;
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);
});