formatter->flush(out);
}
-seastar::future<>
-AdminSocket::register_command(std::unique_ptr<AdminSocketHook>&& hook)
+void AdminSocket::register_command(std::unique_ptr<AdminSocketHook>&& hook)
{
- return seastar::with_lock(servers_tbl_rwlock,
- [this, hook = std::move(hook)]() mutable {
- auto prefix = hook->prefix;
- auto [it, added] = hooks.emplace(prefix, std::move(hook));
- // was this server tag already registered?
- assert(added);
- if (added) {
- logger().info("register_command(): {})", it->first);
- }
- return seastar::now();
- });
+ auto prefix = hook->prefix;
+ auto [it, added] = hooks.emplace(prefix, std::move(hook));
+ assert(added);
+ logger().info("register_command(): {})", it->first);
}
-/*
- * Note: parse_cmd() is executed with servers_tbl_rwlock held as shared
- */
auto AdminSocket::parse_cmd(const std::vector<std::string>& cmd)
-> std::variant<parsed_command_t, tell_result_t>
{
ceph::bufferlist&& buf)
-> seastar::future<tell_result_t>
{
- return seastar::with_shared(servers_tbl_rwlock,
- [cmd, buf=std::move(buf), this]() mutable {
- auto maybe_parsed = parse_cmd(cmd);
- if (auto* parsed = std::get_if<parsed_command_t>(&maybe_parsed); parsed) {
- stringstream os;
- string desc{parsed->hook.desc};
- if (!validate_cmd(nullptr, desc, parsed->params, os)) {
- logger().error("AdminSocket::execute_command: "
- "failed to validate '{}': {}", cmd, os.str());
- ceph::bufferlist out;
- out.append(os);
- return seastar::make_ready_future<tell_result_t>(
- tell_result_t{-EINVAL, "invalid command json", std::move(out)});
- }
- return parsed->hook.call(parsed->params, parsed->format, std::move(buf));
- } else {
- auto& result = std::get<tell_result_t>(maybe_parsed);
- return seastar::make_ready_future<tell_result_t>(std::move(result));
+ auto maybe_parsed = parse_cmd(cmd);
+ if (auto* parsed = std::get_if<parsed_command_t>(&maybe_parsed); parsed) {
+ stringstream os;
+ string desc{parsed->hook.desc};
+ if (!validate_cmd(nullptr, desc, parsed->params, os)) {
+ logger().error("AdminSocket::execute_command: "
+ "failed to validate '{}': {}", cmd, os.str());
+ ceph::bufferlist out;
+ out.append(os);
+ return seastar::make_ready_future<tell_result_t>(
+ tell_result_t{-EINVAL, "invalid command json", std::move(out)});
}
- });
+ return parsed->hook.call(parsed->params, parsed->format, std::move(buf));
+ } else {
+ auto& result = std::get<tell_result_t>(maybe_parsed);
+ return seastar::make_ready_future<tell_result_t>(std::move(result));
+ }
}
// an input_stream consumer that reads buffer into a std::string up to the first
std::string_view format,
ceph::bufferlist&&) const final
{
- return seastar::with_shared(m_as.servers_tbl_rwlock,
- [format, this] {
- unique_ptr<Formatter> f{Formatter::create(format, "json-pretty", "json-pretty")};
- f->open_object_section("help");
- for (const auto& [prefix, hook] : m_as) {
- if (!hook->help.empty()) {
- f->dump_string(prefix.data(), hook->help);
- }
+ unique_ptr<Formatter> f{Formatter::create(format,
+ "json-pretty", "json-pretty")};
+ f->open_object_section("help");
+ for (const auto& [prefix, hook] : m_as) {
+ if (!hook->help.empty()) {
+ f->dump_string(prefix.data(), hook->help);
}
- f->close_section();
- return seastar::make_ready_future<tell_result_t>(std::move(f));
- });
+ }
+ f->close_section();
+ return seastar::make_ready_future<tell_result_t>(std::move(f));
}
};
std::string_view format,
ceph::bufferlist&&) const final
{
- return seastar::with_shared(m_as.servers_tbl_rwlock, [format, this] {
- unique_ptr<Formatter> f{Formatter::create(format, "json-pretty", "json-pretty")};
- int cmdnum = 0;
- f->open_object_section("command_descriptions");
- for (const auto& [prefix, hook] : m_as) {
- auto secname = fmt::format("cmd {:>03}", cmdnum);
- auto cmd = fmt::format("{} {}", hook->prefix, hook->desc);
- dump_cmd_and_help_to_json(f.get(), CEPH_FEATURES_ALL, secname,
- cmd, std::string{hook->help});
- cmdnum++;
- }
- f->close_section();
- return seastar::make_ready_future<tell_result_t>(std::move(f));
- });
+ unique_ptr<Formatter> f{Formatter::create(format, "json-pretty", "json-pretty")};
+ int cmdnum = 0;
+ f->open_object_section("command_descriptions");
+ for (const auto& [prefix, hook] : m_as) {
+ auto secname = fmt::format("cmd {:>03}", cmdnum);
+ auto cmd = fmt::format("{} {}", hook->prefix, hook->desc);
+ dump_cmd_and_help_to_json(f.get(), CEPH_FEATURES_ALL, secname,
+ cmd, std::string{hook->help});
+ cmdnum++;
+ }
+ f->close_section();
+ return seastar::make_ready_future<tell_result_t>(std::move(f));
}
};
};
/// the hooks that are served directly by the admin_socket server
-seastar::future<> AdminSocket::register_admin_commands()
+void AdminSocket::register_admin_commands()
{
- return seastar::when_all_succeed(
- register_command(std::make_unique<VersionHook>()),
- register_command(std::make_unique<GitVersionHook>()),
- register_command(std::make_unique<HelpHook>(*this)),
- register_command(std::make_unique<GetdescsHook>(*this)),
- register_command(std::make_unique<ConfigGetHook>()),
- register_command(std::make_unique<ConfigSetHook>()),
- register_command(std::make_unique<ConfigShowHook>()),
- register_command(std::make_unique<ConfigHelpHook>()),
- register_command(std::make_unique<InjectArgsHook>())
- ).then_unpack([] {
- return seastar::now();
- });
+ register_command(std::make_unique<VersionHook>());
+ register_command(std::make_unique<GitVersionHook>());
+ register_command(std::make_unique<HelpHook>(*this));
+ register_command(std::make_unique<GetdescsHook>(*this));
+ register_command(std::make_unique<ConfigGetHook>());
+ register_command(std::make_unique<ConfigSetHook>());
+ register_command(std::make_unique<ConfigShowHook>());
+ register_command(std::make_unique<ConfigHelpHook>());
+ register_command(std::make_unique<InjectArgsHook>());
}
} // namespace crimson::admin
auto asok_path = local_conf().get_val<std::string>("admin_socket");
using namespace crimson::admin;
return asok->start(asok_path).then([this] {
- return seastar::when_all_succeed(
- asok->register_admin_commands(),
- asok->register_command(make_asok_hook<OsdStatusHook>(std::as_const(*this))),
- asok->register_command(make_asok_hook<SendBeaconHook>(*this)),
- asok->register_command(make_asok_hook<FlushPgStatsHook>(*this)),
- asok->register_command(make_asok_hook<DumpPGStateHistory>(std::as_const(*this))),
- asok->register_command(make_asok_hook<DumpMetricsHook>()),
- asok->register_command(make_asok_hook<DumpPerfCountersHook>()),
- asok->register_command(make_asok_hook<InjectDataErrorHook>(get_shard_services())),
- asok->register_command(make_asok_hook<InjectMDataErrorHook>(get_shard_services())),
- // PG commands
- asok->register_command(make_asok_hook<pg::QueryCommand>(*this)),
- asok->register_command(make_asok_hook<pg::MarkUnfoundLostCommand>(*this)));
- }).then_unpack([] {
- return seastar::now();
+ asok->register_admin_commands();
+ asok->register_command(make_asok_hook<OsdStatusHook>(std::as_const(*this)));
+ asok->register_command(make_asok_hook<SendBeaconHook>(*this));
+ asok->register_command(make_asok_hook<FlushPgStatsHook>(*this));
+ asok->register_command(make_asok_hook<DumpPGStateHistory>(std::as_const(*this)));
+ asok->register_command(make_asok_hook<DumpMetricsHook>());
+ asok->register_command(make_asok_hook<DumpPerfCountersHook>());
+ asok->register_command(make_asok_hook<InjectDataErrorHook>(get_shard_services()));
+ asok->register_command(make_asok_hook<InjectMDataErrorHook>(get_shard_services()));
+ // PG commands
+ asok->register_command(make_asok_hook<pg::QueryCommand>(*this));
+ asok->register_command(make_asok_hook<pg::MarkUnfoundLostCommand>(*this));
});
}