cmd_getval(cmdmap, "prefix", prefix);
// tolerate old-style pg <pgid> command <args> style formatting
if (prefix == "pg") {
- cmd_getval(cmdmap, "cmd", prefix);
+ std::string pg_subcmd;
+ cmd_getval(cmdmap, "cmd", pg_subcmd);
+ prefix = pg_subcmd;
+
+ if (auto arg = cmd_getval<std::string>(cmdmap, "arg"); arg) {
+ if (pg_subcmd == "list_unfound") {
+ cmdmap["offset"] = std::move(*arg);
+ } else if (pg_subcmd == "mark_unfound_lost") {
+ cmdmap["mulcmd"] = std::move(*arg);
+ }
+ cmdmap.erase("arg");
+ }
}
} catch (const bad_cmd_get& e) {
ERROR("invalid syntax: {}", cmd);
#include <memory>
#include <string>
#include <string_view>
+#include <utility>
#include <fmt/format.h>
#include <seastar/core/future.hh>
using namespace crimson::common;
using ceph::common::cmd_getval;
-
namespace crimson::admin::pg {
class PGCommand : public AdminSocketHook {
OSD& osd;
};
+class PGOldFormCommand final : public AdminSocketHook {
+public:
+ explicit PGOldFormCommand(crimson::osd::OSD&) :
+ AdminSocketHook{"pg",
+ "name=pgid,type=CephPgid "
+ "name=cmd,type=CephChoices,strings=query|log|scrub|deep-scrub|list_unfound|mark_unfound_lost "
+ "name=arg,type=CephString,req=false",
+ "old-form wrapper for pg subcommands (query, log, scrub, deep-scrub, list_unfound, mark_unfound_lost)"}
+ {}
+
+ seastar::future<tell_result_t> call(const cmdmap_t&,
+ std::string_view,
+ ceph::bufferlist&&) const final
+ {
+ // This hook exists only for schema advertisement via get_command_descriptions.
+ // parse_cmd() always rewrites prefix away from "pg" before dispatch.
+ std::unreachable();
+ }
+};
+
class QueryCommand final : public PGCommand {
public:
// TODO: const correctness of osd
explicit QueryCommand(crimson::osd::OSD& osd) :
PGCommand{osd,
"query",
- "",
+ "name=pgid,type=CephPgid",
"show details of a specific pg"}
{}
private:
return std::make_unique<Hook>(std::forward<Args>(args)...);
}
+template std::unique_ptr<AdminSocketHook>
+make_asok_hook<crimson::admin::pg::PGOldFormCommand>(crimson::osd::OSD& osd);
+
template std::unique_ptr<AdminSocketHook>
make_asok_hook<crimson::admin::pg::QueryCommand>(crimson::osd::OSD& osd);
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::PGOldFormCommand>(*this));
asok->register_command(make_asok_hook<pg::QueryCommand>(*this));
asok->register_command(make_asok_hook<pg::MarkUnfoundLostCommand>(*this));
asok->register_command(make_asok_hook<pg::ScrubCommand<true>>(*this));