Pass std::string_view to call, rather than passing strings by value.
Change cmdmap_t and the maps in admin_socket to use the std::less<>
transparent comparator, so we can compare string_views to strings. (Or
anything else with an equality operator with strings.)
Pass the cmdmap_t in to call by const reference, not reference.
The change to cmdmap_t requires changing some of the users of
cmdmap_t. (That is, make them actually use cmdmap_t explicitly, not
the open-coed map type.)
Signed-off-by: Adam C. Emerson <aemerson@redhat.com>
{
}
-bool Client::CommandHook::call(std::string command, cmdmap_t& cmdmap,
- std::string format, bufferlist& out)
+bool Client::CommandHook::call(std::string_view command,
+ const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out)
{
std::unique_ptr<Formatter> f(Formatter::create(format));
f->open_object_section("result");
Client *m_client;
public:
explicit CommandHook(Client *client);
- bool call(std::string command, cmdmap_t &cmdmap, std::string format,
- bufferlist& out) override;
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) override;
};
CommandHook m_command_hook;
bool rval = false;
- map<string, cmd_vartype> cmdmap;
+ cmdmap_t cmdmap;
string format;
vector<string> cmdvec;
stringstream errss;
p = m_hooks.find(match);
if (p != m_hooks.end())
break;
-
+
// drop right-most word
size_t pos = match.rfind(' ');
if (pos == std::string::npos) {
}
bool AdminSocket::validate(const std::string& command,
- const cmdmap_t& cmdmap,
- bufferlist& out) const
+ const cmdmap_t& cmdmap,
+ bufferlist& out) const
{
stringstream os;
if (validate_cmd(m_cct, m_descs.at(command), cmdmap, os)) {
}
}
-int AdminSocket::register_command(std::string command, std::string cmddesc, AdminSocketHook *hook, std::string help)
+int AdminSocket::register_command(std::string_view command,
+ std::string_view cmddesc,
+ AdminSocketHook *hook,
+ std::string_view help)
{
int ret;
m_lock.Lock();
ret = -EEXIST;
} else {
ldout(m_cct, 5) << "register_command " << command << " hook " << hook << dendl;
- m_hooks[command] = hook;
- m_descs[command] = cmddesc;
- m_help[command] = help;
+ m_hooks.emplace(command, hook);
+ m_descs.emplace(command, cmddesc);
+ m_help.emplace(command, help);
ret = 0;
- }
+ }
m_lock.Unlock();
return ret;
}
-int AdminSocket::unregister_command(std::string command)
+int AdminSocket::unregister_command(std::string_view command)
{
int ret;
m_lock.Lock();
if (m_hooks.count(command)) {
ldout(m_cct, 5) << "unregister_command " << command << dendl;
- m_hooks.erase(command);
- m_descs.erase(command);
- m_help.erase(command);
+ m_hooks.erase(m_hooks.find(command));
+ m_descs.erase(m_descs.find(command));
+ m_help.erase(m_help.find(command));
// If we are currently processing a command, wait for it to
// complete in case it referenced the hook that we are
class VersionHook : public AdminSocketHook {
public:
- bool call(std::string command, cmdmap_t &cmdmap, std::string format,
- bufferlist& out) override {
- if (command == "0") {
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) override {
+ if (command == "0"sv) {
out.append(CEPH_ADMIN_SOCK_VERSION);
} else {
JSONFormatter jf;
AdminSocket *m_as;
public:
explicit HelpHook(AdminSocket *as) : m_as(as) {}
- bool call(string command, cmdmap_t &cmdmap, string format, bufferlist& out) override {
- Formatter *f = Formatter::create(format, "json-pretty", "json-pretty");
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format,
+ bufferlist& out) override {
+ auto f = Formatter::create(format, "json-pretty"sv, "json-pretty"sv);
f->open_object_section("help");
- for (map<string,string>::iterator p = m_as->m_help.begin();
- p != m_as->m_help.end();
- ++p) {
- if (p->second.length())
- f->dump_string(p->first.c_str(), p->second);
+ for (const auto& [command, help] : m_as->m_help) {
+ if (help.length())
+ f->dump_string(command.c_str(), help);
}
f->close_section();
ostringstream ss;
AdminSocket *m_as;
public:
explicit GetdescsHook(AdminSocket *as) : m_as(as) {}
- bool call(string command, cmdmap_t &cmdmap, string format, bufferlist& out) override {
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) override {
int cmdnum = 0;
JSONFormatter jf;
jf.open_object_section("command_descriptions");
- for (map<string,string>::iterator p = m_as->m_descs.begin();
- p != m_as->m_descs.end();
- ++p) {
+ for (const auto& [command, desc] : m_as->m_descs) {
ostringstream secname;
secname << "cmd" << setfill('0') << std::setw(3) << cmdnum;
dump_cmd_and_help_to_json(&jf,
secname.str().c_str(),
- p->second.c_str(),
- m_as->m_help[p->first]);
+ desc,
+ m_as->m_help[command]);
cmdnum++;
}
jf.close_section(); // command_descriptions
}
};
-bool AdminSocket::init(const std::string &path)
+bool AdminSocket::init(const std::string& path)
{
ldout(m_cct, 5) << "init " << path << dendl;
#ifndef CEPH_COMMON_ADMIN_SOCKET_H
#define CEPH_COMMON_ADMIN_SOCKET_H
+#include <string_view>
+
#include "common/Cond.h"
class AdminSocket;
class CephContext;
-#define CEPH_ADMIN_SOCK_VERSION "2"
+inline constexpr auto CEPH_ADMIN_SOCK_VERSION = "2"sv;
class AdminSocketHook {
public:
- virtual bool call(std::string command, cmdmap_t &cmdmap, std::string format,
- bufferlist& out) = 0;
+ virtual bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) = 0;
virtual ~AdminSocketHook() {}
};
AdminSocket(CephContext *cct);
~AdminSocket() override;
+ AdminSocket(const AdminSocket&) = delete;
+ AdminSocket& operator =(const AdminSocket&) = delete;
+ AdminSocket(AdminSocket&&) = delete;
+ AdminSocket& operator =(AdminSocket&&) = delete;
+
/**
* register an admin socket command
*
*
* @return 0 for success, -EEXIST if command already registered.
*/
- int register_command(std::string command, std::string cmddesc, AdminSocketHook *hook, std::string help);
+ int register_command(std::string_view command,
+ std::string_view cmddesc,
+ AdminSocketHook *hook,
+ std::string_view help);
/**
* unregister an admin socket command.
* @param command command string
* @return 0 on succest, -ENOENT if command dne.
*/
- int unregister_command(std::string command);
+ int unregister_command(std::string_view command);
- bool init(const std::string &path);
+ bool init(const string& path);
void chown(uid_t uid, gid_t gid);
void chmod(mode_t mode);
private:
- AdminSocket(const AdminSocket& rhs);
- AdminSocket& operator=(const AdminSocket &rhs);
void shutdown();
Mutex m_lock; // protects m_hooks, m_descs, m_help
AdminSocketHook *m_version_hook, *m_help_hook, *m_getdescs_hook;
- std::map<std::string,AdminSocketHook*> m_hooks;
- std::map<std::string,std::string> m_descs;
- std::map<std::string,std::string> m_help;
+ std::map<std::string,AdminSocketHook*, std::less<>> m_hooks;
+ std::map<std::string,std::string, std::less<>> m_descs;
+ std::map<std::string,std::string, std::less<>> m_help;
friend class AdminSocketTest;
friend class HelpHook;
}
// AdminSocketHook
- bool call(std::string command, cmdmap_t& cmdmap, std::string format,
- bufferlist& out) override {
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) override {
if (command == "dump_mempools") {
std::unique_ptr<Formatter> f(Formatter::create(format));
f->open_object_section("mempools");
public:
explicit CephContextHook(CephContext *cct) : m_cct(cct) {}
- bool call(std::string command, cmdmap_t& cmdmap, std::string format,
- bufferlist& out) override {
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) override {
m_cct->do_command(command, cmdmap, format, &out);
return true;
}
};
-void CephContext::do_command(std::string command, cmdmap_t& cmdmap,
- std::string format, bufferlist *out)
+void CephContext::do_command(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist *out)
{
Formatter *f = Formatter::create(format, "json-pretty", "json-pretty");
stringstream ss;
- for (cmdmap_t::iterator it = cmdmap.begin(); it != cmdmap.end(); ++it) {
+ for (auto it = cmdmap.begin(); it != cmdmap.end(); ++it) {
if (it->first != "prefix") {
ss << it->first << ":" << cmd_vartype_stringify(it->second) << " ";
}
}
else if (command == "perf reset") {
std::string var;
- string section = command;
+ std::string section(command);
f->open_object_section(section.c_str());
if (!cmd_getval(this, cmdmap, "var", var)) {
f->dump_string("error", "syntax error: 'perf reset <var>'");
if(!_perf_counters_collection->reset(var))
f->dump_stream("error") << "Not find: " << var;
else
- f->dump_string("success", command + ' ' + var);
+ f->dump_string("success", std::string(command) + ' ' + var);
}
f->close_section();
}
else {
- string section = command;
+ std::string section(command);
boost::replace_all(section, " ", "_");
f->open_object_section(section.c_str());
if (command == "config show") {
/**
* process an admin socket command
*/
- void do_command(std::string command, cmdmap_t& cmdmap, std::string format,
- ceph::bufferlist *out);
+ void do_command(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, ceph::bufferlist *out);
template<typename T>
void lookup_or_create_singleton_object(T*& p, const std::string &name) {
* false, ss is valid */
bool
-cmdmap_from_json(vector<string> cmd, map<string, cmd_vartype> *mapp, stringstream &ss)
+cmdmap_from_json(vector<string> cmd, cmdmap_t *mapp, stringstream &ss)
{
json_spirit::mValue v;
std::vector<std::string>,
std::vector<int64_t>,
std::vector<double>> cmd_vartype;
-typedef std::map<std::string, cmd_vartype> cmdmap_t;
+typedef std::map<std::string, cmd_vartype, std::less<>> cmdmap_t;
std::string cmddesc_get_prefix(const std::string &cmddesc);
void dump_cmd_to_json(ceph::Formatter *f, const std::string& cmd);
}
}
-bool LibrbdAdminSocketHook::call(std::string command, cmdmap_t& cmdmap,
- std::string format, bufferlist& out) {
+bool LibrbdAdminSocketHook::call(std::string_view command,
+ const cmdmap_t& cmdmap,
+ std::string_view format,
+ bufferlist& out) {
Commands::const_iterator i = commands.find(command);
assert(i != commands.end());
stringstream ss;
LibrbdAdminSocketHook(ImageCtx *ictx);
~LibrbdAdminSocketHook() override;
- bool call(std::string command, cmdmap_t& cmdmap, std::string format,
- bufferlist& out) override;
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) override;
private:
- typedef std::map<std::string,LibrbdAdminSocketCommand*> Commands;
+ typedef std::map<std::string,LibrbdAdminSocketCommand*,
+ std::less<>> Commands;
AdminSocket *admin_socket;
Commands commands;
MDSDaemon *mds;
public:
explicit MDSSocketHook(MDSDaemon *m) : mds(m) {}
- bool call(std::string command, cmdmap_t& cmdmap, std::string format,
- bufferlist& out) override {
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) override {
stringstream ss;
bool r = mds->asok_command(command, cmdmap, format, ss);
out.append(ss);
}
};
-bool MDSDaemon::asok_command(string command, cmdmap_t& cmdmap, string format,
- ostream& ss)
+bool MDSDaemon::asok_command(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, std::ostream& ss)
{
dout(1) << "asok_command: " << command << " (starting...)" << dendl;
void set_up_admin_socket();
void clean_up_admin_socket();
void check_ops_in_flight(); // send off any slow ops to monitor
- bool asok_command(string command, cmdmap_t& cmdmap, string format,
- ostream& ss);
+ bool asok_command(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, ostream& ss);
void dump_status(Formatter *f);
snapclient->handle_mds_failure(who);
}
-bool MDSRankDispatcher::handle_asok_command(
- std::string command, cmdmap_t& cmdmap, Formatter *f,
- std::ostream& ss)
+bool MDSRankDispatcher::handle_asok_command(std::string_view command,
+ const cmdmap_t& cmdmap,
+ Formatter *f,
+ std::ostream& ss)
{
if (command == "dump_ops_in_flight" ||
command == "ops") {
void init();
void tick();
void shutdown();
- bool handle_asok_command(std::string command, cmdmap_t& cmdmap,
+ bool handle_asok_command(std::string_view command, const cmdmap_t& cmdmap,
Formatter *f, std::ostream& ss);
void handle_mds_map(MMDSMap *m, MDSMap *oldmap);
void handle_osd_map();
void DaemonServer::_generate_command_map(
- map<string,cmd_vartype>& cmdmap,
+ cmdmap_t& cmdmap,
map<string,string> ¶m_str_map)
{
- for (map<string,cmd_vartype>::const_iterator p = cmdmap.begin();
+ for (auto p = cmdmap.begin();
p != cmdmap.end(); ++p) {
if (p->first == "prefix")
continue;
MgrSession *s,
const string &module,
const string &prefix,
- const map<string,cmd_vartype>& cmdmap,
+ const cmdmap_t& cmdmap,
const map<string,string>& param_str_map,
const MonCommand *this_cmd) {
Mutex lock;
- static void _generate_command_map(map<string,cmd_vartype>& cmdmap,
+ static void _generate_command_map(cmdmap_t& cmdmap,
map<string,string> ¶m_str_map);
static const MonCommand *_get_mgrcommand(const string &cmd_prefix,
const std::vector<MonCommand> &commands);
bool _allowed_command(
MgrSession *s, const string &module, const string &prefix,
- const map<string,cmd_vartype>& cmdmap,
+ const cmdmap_t& cmdmap,
const map<string,string>& param_str_map,
const MonCommand *this_cmd);
bufferlist rdata;
stringstream ss, ds;
- map<string, cmd_vartype> cmdmap;
+ cmdmap_t cmdmap;
if (!cmdmap_from_json(m->cmd, &cmdmap, ss)) {
// ss has reason for failure
string rs = ss.str();
string rs;
int err = -EINVAL;
- map<string, cmd_vartype> cmdmap;
+ cmdmap_t cmdmap;
if (!cmdmap_from_json(m->cmd, &cmdmap, ss)) {
// ss has reason for failure
string rs = ss.str();
bufferlist rdata;
string prefix;
- map<string, cmd_vartype> cmdmap;
+ cmdmap_t cmdmap;
if (!cmdmap_from_json(cmd->cmd, &cmdmap, ss)) {
return false;
Monitor *mon,
FSMap &fsmap,
MonOpRequestRef op,
- map<string, cmd_vartype> &cmdmap,
+ const cmdmap_t& cmdmap,
std::stringstream &ss) override
{
string flag_name;
Monitor *mon,
FSMap &fsmap,
MonOpRequestRef op,
- map<string, cmd_vartype> &cmdmap,
+ const cmdmap_t& cmdmap,
std::stringstream &ss) override
{
assert(m_paxos->is_plugged());
Monitor *mon,
FSMap &fsmap,
MonOpRequestRef op,
- map<string, cmd_vartype> &cmdmap,
+ const cmdmap_t& cmdmap,
std::stringstream &ss) override
{
std::string fs_name;
Monitor *mon,
FSMap &fsmap,
MonOpRequestRef op,
- map<string, cmd_vartype> &cmdmap,
+ const cmdmap_t& cmdmap,
std::stringstream &ss) override
{
assert(m_paxos->is_plugged());
Monitor *mon,
FSMap &fsmap,
MonOpRequestRef op,
- map<string, cmd_vartype> &cmdmap,
+ const cmdmap_t& cmdmap,
std::stringstream &ss) override
{
std::string fs_name;
Monitor *mon,
FSMap &fsmap,
MonOpRequestRef op,
- map<string, cmd_vartype> &cmdmap,
+ const cmdmap_t& cmdmap,
std::stringstream &ss) override
{
// Check caller has correctly named the FS to delete
Monitor *mon,
FSMap &fsmap,
MonOpRequestRef op,
- map<string, cmd_vartype> &cmdmap,
+ const cmdmap_t& cmdmap,
std::stringstream &ss) override
{
string fs_name;
Monitor *mon,
FSMap &fsmap,
MonOpRequestRef op,
- map<string, cmd_vartype> &cmdmap,
+ const cmdmap_t& cmdmap,
std::stringstream &ss) override
{
string poolname;
Monitor *mon,
FSMap &fsmap,
MonOpRequestRef op,
- map<string, cmd_vartype> &cmdmap,
+ const cmdmap_t& cmdmap,
std::stringstream &ss) override
{
return T::handle(mon, fsmap, op, cmdmap, ss);
Monitor *mon,
FSMap &fsmap,
MonOpRequestRef op,
- map<string, cmd_vartype> &cmdmap,
+ const cmdmap_t& cmdmap,
std::stringstream &ss) = 0;
};
bufferlist rdata;
stringstream ss;
- map<string, cmd_vartype> cmdmap;
+ cmdmap_t cmdmap;
if (!cmdmap_from_json(m->cmd, &cmdmap, ss)) {
string rs = ss.str();
mon->reply_command(op, -EINVAL, rs, get_last_committed());
string rs;
int err = -EINVAL;
- map<string, cmd_vartype> cmdmap;
+ cmdmap_t cmdmap;
if (!cmdmap_from_json(m->cmd, &cmdmap, ss)) {
// ss has reason for failure
string rs = ss.str();
bufferlist rdata;
stringstream ss, ds;
- map<string, cmd_vartype> cmdmap;
+ cmdmap_t cmdmap;
if (!cmdmap_from_json(m->cmd, &cmdmap, ss)) {
// ss has reason for failure
string rs = ss.str();
stringstream ss;
bufferlist rdata;
- map<string, cmd_vartype> cmdmap;
+ cmdmap_t cmdmap;
if (!cmdmap_from_json(m->cmd, &cmdmap, ss)) {
string rs = ss.str();
mon->reply_command(op, -EINVAL, rs, rdata, get_last_committed());
int MDSMonitor::filesystem_command(
MonOpRequestRef op,
std::string const &prefix,
- map<string, cmd_vartype> &cmdmap,
+ const cmdmap_t& cmdmap,
std::stringstream &ss)
{
dout(4) << __func__ << " prefix='" << prefix << "'" << dendl;
mds_gid_t gid;
if (!cmd_getval(g_ceph_context, cmdmap, "gid", gid)) {
ss << "error parsing 'gid' value '"
- << cmd_vartype_stringify(cmdmap["gid"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("gid")) << "'";
return -EINVAL;
}
MDSMap::DaemonState state;
if (!cmd_getval(g_ceph_context, cmdmap, "state", state)) {
ss << "error parsing 'state' string value '"
- << cmd_vartype_stringify(cmdmap["state"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("state")) << "'";
return -EINVAL;
}
if (pending_fsmap.gid_exists(gid)) {
mds_gid_t gid;
if (!cmd_getval(g_ceph_context, cmdmap, "gid", gid)) {
ss << "error parsing 'gid' value '"
- << cmd_vartype_stringify(cmdmap["gid"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("gid")) << "'";
return -EINVAL;
}
if (!pending_fsmap.gid_exists(gid)) {
int64_t f;
if (!cmd_getval(g_ceph_context, cmdmap, "feature", f)) {
ss << "error parsing feature value '"
- << cmd_vartype_stringify(cmdmap["feature"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("feature")) << "'";
return -EINVAL;
}
if (pending_fsmap.compat.compat.contains(f)) {
int64_t f;
if (!cmd_getval(g_ceph_context, cmdmap, "feature", f)) {
ss << "error parsing feature value '"
- << cmd_vartype_stringify(cmdmap["feature"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("feature")) << "'";
return -EINVAL;
}
if (pending_fsmap.compat.incompat.contains(f)) {
int filesystem_command(
MonOpRequestRef op,
std::string const &prefix,
- map<string, cmd_vartype> &cmdmap,
+ const cmdmap_t& cmdmap,
std::stringstream &ss);
// beacons
std::stringstream ss;
bufferlist rdata;
- std::map<std::string, cmd_vartype> cmdmap;
+ cmdmap_t cmdmap;
if (!cmdmap_from_json(m->cmd, &cmdmap, ss)) {
string rs = ss.str();
mon->reply_command(op, -EINVAL, rs, rdata, get_last_committed());
std::stringstream ss;
bufferlist rdata;
- std::map<std::string, cmd_vartype> cmdmap;
+ cmdmap_t cmdmap;
if (!cmdmap_from_json(m->cmd, &cmdmap, ss)) {
string rs = ss.str();
mon->reply_command(op, -EINVAL, rs, rdata, get_last_committed());
Monitor *mon;
public:
explicit AdminHook(Monitor *m) : mon(m) {}
- bool call(std::string command, cmdmap_t& cmdmap, std::string format,
- bufferlist& out) override {
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) override {
stringstream ss;
mon->do_admin_command(command, cmdmap, format, ss);
out.append(ss);
}
};
-void Monitor::do_admin_command(string command, cmdmap_t& cmdmap, string format,
- ostream& ss)
+void Monitor::do_admin_command(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, std::ostream& ss)
{
Mutex::Locker l(lock);
boost::scoped_ptr<Formatter> f(Formatter::create(format));
string args;
- for (cmdmap_t::iterator p = cmdmap.begin();
+ for (auto p = cmdmap.begin();
p != cmdmap.end(); ++p) {
if (p->first == "prefix")
continue;
}
}
-bool Monitor::_add_bootstrap_peer_hint(string cmd, cmdmap_t& cmdmap, ostream& ss)
+bool Monitor::_add_bootstrap_peer_hint(std::string_view cmd,
+ const cmdmap_t& cmdmap,
+ ostream& ss)
{
string addrstr;
if (!cmd_getval(g_ceph_context, cmdmap, "addr", addrstr)) {
ss << "unable to parse address string value '"
- << cmd_vartype_stringify(cmdmap["addr"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("addr")) << "'";
return false;
}
dout(10) << "_add_bootstrap_peer_hint '" << cmd << "' '"
}
}
-void Monitor::_generate_command_map(map<string,cmd_vartype>& cmdmap,
+void Monitor::_generate_command_map(cmdmap_t& cmdmap,
map<string,string> ¶m_str_map)
{
- for (map<string,cmd_vartype>::const_iterator p = cmdmap.begin();
- p != cmdmap.end(); ++p) {
+ for (auto p = cmdmap.begin(); p != cmdmap.end(); ++p) {
if (p->first == "prefix")
continue;
if (p->first == "caps") {
return nullptr;
}
-bool Monitor::_allowed_command(MonSession *s, string &module, string &prefix,
- const map<string,cmd_vartype>& cmdmap,
+bool Monitor::_allowed_command(MonSession *s, const string &module,
+ const string &prefix, const cmdmap_t& cmdmap,
const map<string,string>& param_str_map,
const MonCommand *this_cmd) {
string prefix;
vector<string> fullcmd;
- map<string, cmd_vartype> cmdmap;
+ cmdmap_t cmdmap;
stringstream ss, ds;
bufferlist rdata;
string rs;
void handle_subscribe(MonOpRequestRef op);
void handle_mon_get_map(MonOpRequestRef op);
- static void _generate_command_map(map<string,cmd_vartype>& cmdmap,
+ static void _generate_command_map(cmdmap_t& cmdmap,
map<string,string> ¶m_str_map);
static const MonCommand *_get_moncommand(
const string &cmd_prefix,
const vector<MonCommand>& cmds);
- bool _allowed_command(MonSession *s, string &module, string &prefix,
- const map<string,cmd_vartype>& cmdmap,
+ bool _allowed_command(MonSession *s, const string& module,
+ const string& prefix,
+ const cmdmap_t& cmdmap,
const map<string,string>& param_str_map,
const MonCommand *this_cmd);
void get_mon_status(Formatter *f, ostream& ss);
void _quorum_status(Formatter *f, ostream& ss);
- bool _add_bootstrap_peer_hint(string cmd, cmdmap_t& cmdmap, ostream& ss);
+ bool _add_bootstrap_peer_hint(std::string_view cmd, const cmdmap_t& cmdmap,
+ std::ostream& ss);
void handle_command(MonOpRequestRef op);
void handle_route(MonOpRequestRef op);
int write_fsid();
int write_fsid(MonitorDBStore::TransactionRef t);
- void do_admin_command(std::string command, cmdmap_t& cmdmap,
- std::string format, ostream& ss);
+ void do_admin_command(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, std::ostream& ss);
private:
// don't allow copying
bufferlist rdata;
stringstream ss;
- map<string, cmd_vartype> cmdmap;
+ cmdmap_t cmdmap;
if (!cmdmap_from_json(m->cmd, &cmdmap, ss)) {
string rs = ss.str();
mon->reply_command(op, -EINVAL, rs, rdata, get_last_committed());
string rs;
int err = -EINVAL;
- map<string, cmd_vartype> cmdmap;
+ cmdmap_t cmdmap;
if (!cmdmap_from_json(m->cmd, &cmdmap, ss)) {
string rs = ss.str();
mon->reply_command(op, -EINVAL, rs, get_last_committed());
bufferlist rdata;
stringstream ss, ds;
- map<string, cmd_vartype> cmdmap;
+ cmdmap_t cmdmap;
if (!cmdmap_from_json(m->cmd, &cmdmap, ss)) {
string rs = ss.str();
mon->reply_command(op, -EINVAL, rs, get_last_committed());
return true;
}
-int OSDMonitor::prepare_command_pool_set(map<string,cmd_vartype> &cmdmap,
+int OSDMonitor::prepare_command_pool_set(const cmdmap_t& cmdmap,
stringstream& ss)
{
string poolstr;
}
int OSDMonitor::prepare_command_pool_application(const string &prefix,
- map<string,cmd_vartype> &cmdmap,
+ const cmdmap_t& cmdmap,
stringstream& ss)
{
string pool_name;
int OSDMonitor::prepare_command_osd_new(
MonOpRequestRef op,
- const map<string,cmd_vartype>& cmdmap,
+ const cmdmap_t& cmdmap,
const map<string,string>& params,
stringstream &ss,
Formatter *f)
op->mark_osdmon_event(__func__);
MMonCommand *m = static_cast<MMonCommand*>(op->get_req());
stringstream ss;
- map<string, cmd_vartype> cmdmap;
+ cmdmap_t cmdmap;
if (!cmdmap_from_json(m->cmd, &cmdmap, ss)) {
string rs = ss.str();
mon->reply_command(op, -EINVAL, rs, get_last_committed());
}
static int parse_reweights(CephContext *cct,
- const map<string,cmd_vartype> &cmdmap,
+ const cmdmap_t& cmdmap,
const OSDMap& osdmap,
map<int32_t, uint32_t>* weights)
{
}
bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
- map<string,cmd_vartype> &cmdmap)
+ const cmdmap_t& cmdmap)
{
op->mark_osdmon_event(__func__);
MMonCommand *m = static_cast<MMonCommand*>(op->get_req());
double weight;
if (!cmd_getval(cct, cmdmap, "weight", weight)) {
ss << "unable to parse weight value '"
- << cmd_vartype_stringify(cmdmap["weight"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("weight")) << "'";
err = -EINVAL;
goto reply;
}
double weight;
if (!cmd_getval(cct, cmdmap, "weight", weight)) {
ss << "unable to parse weight value '"
- << cmd_vartype_stringify(cmdmap["weight"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("weight")) << "'";
err = -EINVAL;
goto reply;
}
double w;
if (!cmd_getval(cct, cmdmap, "weight", w)) {
ss << "unable to parse weight value '"
- << cmd_vartype_stringify(cmdmap["weight"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("weight")) << "'";
err = -EINVAL;
goto reply;
}
double w;
if (!cmd_getval(cct, cmdmap, "weight", w)) {
ss << "unable to parse weight value '"
- << cmd_vartype_stringify(cmdmap["weight"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("weight")) << "'";
err = -EINVAL;
goto reply;
}
int64_t value = -1;
if (!cmd_getval(cct, cmdmap, "value", value)) {
err = -EINVAL;
- ss << "failed to parse integer value " << cmd_vartype_stringify(cmdmap["value"]);
+ ss << "failed to parse integer value "
+ << cmd_vartype_stringify(cmdmap.at("value"));
goto reply;
}
int64_t newmax;
if (!cmd_getval(cct, cmdmap, "newmax", newmax)) {
ss << "unable to parse 'newmax' value '"
- << cmd_vartype_stringify(cmdmap["newmax"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("newmax")) << "'";
err = -EINVAL;
goto reply;
}
double n;
if (!cmd_getval(cct, cmdmap, "ratio", n)) {
ss << "unable to parse 'ratio' value '"
- << cmd_vartype_stringify(cmdmap["ratio"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("ratio")) << "'";
err = -EINVAL;
goto reply;
}
string pgidstr;
if (!cmd_getval(cct, cmdmap, "pgid", pgidstr)) {
ss << "unable to parse 'pgid' value '"
- << cmd_vartype_stringify(cmdmap["pgid"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("pgid")) << "'";
err = -EINVAL;
goto reply;
}
string pgidstr;
if (!cmd_getval(cct, cmdmap, "pgid", pgidstr)) {
ss << "unable to parse 'pgid' value '"
- << cmd_vartype_stringify(cmdmap["pgid"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("pgid")) << "'";
err = -EINVAL;
goto reply;
}
int64_t osd;
if (!cmd_getval(cct, cmdmap, "id", osd)) {
ss << "unable to parse 'id' value '"
- << cmd_vartype_stringify(cmdmap["id"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("id")) << "'";
err = -EINVAL;
goto reply;
}
string pgidstr;
if (!cmd_getval(cct, cmdmap, "pgid", pgidstr)) {
ss << "unable to parse 'pgid' value '"
- << cmd_vartype_stringify(cmdmap["pgid"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("pgid")) << "'";
err = -EINVAL;
goto reply;
}
vector<int64_t> id_vec;
if (!cmd_getval(cct, cmdmap, "id", id_vec)) {
ss << "unable to parse 'id' value(s) '"
- << cmd_vartype_stringify(cmdmap["id"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("id")) << "'";
err = -EINVAL;
goto reply;
}
vector<int64_t> id_vec;
if (!cmd_getval(cct, cmdmap, "id", id_vec)) {
ss << "unable to parse 'id' value(s) '"
- << cmd_vartype_stringify(cmdmap["id"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("id")) << "'";
err = -EINVAL;
goto reply;
}
int64_t id;
if (!cmd_getval(cct, cmdmap, "id", id)) {
ss << "invalid osd id value '"
- << cmd_vartype_stringify(cmdmap["id"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("id")) << "'";
err = -EINVAL;
goto reply;
}
double w;
if (!cmd_getval(cct, cmdmap, "weight", w)) {
ss << "unable to parse 'weight' value '"
- << cmd_vartype_stringify(cmdmap["weight"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("weight")) << "'";
err = -EINVAL;
goto reply;
}
int64_t id;
if (!cmd_getval(cct, cmdmap, "id", id)) {
ss << "unable to parse osd id value '"
- << cmd_vartype_stringify(cmdmap["id"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("id")) << "'";
err = -EINVAL;
goto reply;
}
double w;
if (!cmd_getval(cct, cmdmap, "weight", w)) {
ss << "unable to parse weight value '"
- << cmd_vartype_stringify(cmdmap["weight"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("weight")) << "'";
err = -EINVAL;
goto reply;
}
err = parse_reweights(cct, cmdmap, osdmap, &weights);
if (err) {
ss << "unable to parse 'weights' value '"
- << cmd_vartype_stringify(cmdmap["weights"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("weights")) << "'";
goto reply;
}
pending_inc.new_weight.insert(weights.begin(), weights.end());
int64_t id;
if (!cmd_getval(cct, cmdmap, "id", id)) {
ss << "unable to parse osd id value '"
- << cmd_vartype_stringify(cmdmap["id"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("id")) << "'";
err = -EINVAL;
goto reply;
}
int64_t id;
if (!cmd_getval(cct, cmdmap, "id", id)) {
ss << "unable to parse osd id value '"
- << cmd_vartype_stringify(cmdmap["id"]) << "";
+ << cmd_vartype_stringify(cmdmap.at("id")) << "";
err = -EINVAL;
goto reply;
}
int64_t size = 0;
if (!cmd_getval(cct, cmdmap, "size", size)) {
ss << "unable to parse 'size' value '"
- << cmd_vartype_stringify(cmdmap["size"]) << "'";
+ << cmd_vartype_stringify(cmdmap.at("size")) << "'";
err = -EINVAL;
goto reply;
}
bool preprocess_command(MonOpRequestRef op);
bool prepare_command(MonOpRequestRef op);
- bool prepare_command_impl(MonOpRequestRef op, map<string,cmd_vartype>& cmdmap);
+ bool prepare_command_impl(MonOpRequestRef op, const cmdmap_t& cmdmap);
int validate_osd_create(
const int32_t id,
int prepare_command_osd_remove(int32_t id);
int prepare_command_osd_new(
MonOpRequestRef op,
- const map<string,cmd_vartype>& cmdmap,
+ const cmdmap_t& cmdmap,
const map<string,string>& secrets,
stringstream &ss,
Formatter *f);
- int prepare_command_pool_set(map<string,cmd_vartype> &cmdmap,
+ int prepare_command_pool_set(const cmdmap_t& cmdmap,
stringstream& ss);
int prepare_command_pool_application(const string &prefix,
- map<string,cmd_vartype> &cmdmap,
+ const cmdmap_t& cmdmap,
stringstream& ss);
bool handle_osd_timeouts(const utime_t &now,
int process_pg_map_command(
const string& orig_prefix,
- const map<string,cmd_vartype>& orig_cmdmap,
+ const cmdmap_t& orig_cmdmap,
const PGMap& pg_map,
const OSDMap& osdmap,
Formatter *f,
bufferlist *odata)
{
string prefix = orig_prefix;
- map<string,cmd_vartype> cmdmap = orig_cmdmap;
+ auto cmdmap = orig_cmdmap;
// perhaps these would be better in the parsing, but it's weird
bool primary = false;
int process_pg_map_command(
const string& prefix,
- const map<string,cmd_vartype>& cmdmap,
+ const cmdmap_t& cmdmap,
const PGMap& pg_map,
const OSDMap& osdmap,
Formatter *f,
namespace ceph {
namespace osd_cmds {
-int heap(CephContext& cct, cmdmap_t& cmdmap, Formatter& f, std::ostream& os);
+int heap(CephContext& cct, const cmdmap_t& cmdmap, Formatter& f, std::ostream& os);
}} // namespace ceph::osd_cmds
OSD *osd;
public:
explicit OSDSocketHook(OSD *o) : osd(o) {}
- bool call(std::string admin_command, cmdmap_t& cmdmap, std::string format,
- bufferlist& out) override {
+ bool call(std::string_view admin_command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) override {
stringstream ss;
bool r = osd->asok_command(admin_command, cmdmap, format, ss);
out.append(ss);
return pools;
}
-bool OSD::asok_command(string admin_command, cmdmap_t& cmdmap, string format,
- ostream& ss)
+bool OSD::asok_command(std::string_view admin_command, const cmdmap_t& cmdmap,
+ std::string_view format, ostream& ss)
{
Formatter *f = Formatter::create(format, "json-pretty", "json-pretty");
if (admin_command == "status") {
ObjectStore *store;
public:
TestOpsSocketHook(OSDService *s, ObjectStore *st) : service(s), store(st) {}
- bool call(std::string command, cmdmap_t& cmdmap, std::string format,
- bufferlist& out) override {
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) override {
stringstream ss;
test_ops(service, store, command, cmdmap, ss);
out.append(ss);
return true;
}
void test_ops(OSDService *service, ObjectStore *store,
- const std::string &command, cmdmap_t& cmdmap, ostream &ss);
+ std::string_view command, const cmdmap_t& cmdmap, ostream &ss);
};
//
// set_recovery_delay [utime]
void TestOpsSocketHook::test_ops(OSDService *service, ObjectStore *store,
- const std::string &command, cmdmap_t& cmdmap, ostream &ss)
+ std::string_view command,
+ const cmdmap_t& cmdmap, ostream &ss)
{
//Test support
//Support changing the omap on a single osd by using the Admin Socket to
dout(20) << "do_command tid " << tid << " " << cmd << dendl;
- map<string, cmd_vartype> cmdmap;
+ cmdmap_t cmdmap;
string prefix;
string format;
string pgidstr;
namespace ceph {
namespace osd_cmds {
-int heap(CephContext& cct, cmdmap_t& cmdmap, Formatter& f, std::ostream& os)
+int heap(CephContext& cct, const cmdmap_t& cmdmap, Formatter& f,
+ std::ostream& os)
{
if (!ceph_using_tcmalloc()) {
os << "could not issue heap profiler command -- not using tcmalloc!";
// asok
friend class OSDSocketHook;
class OSDSocketHook *asok_hook;
- bool asok_command(string admin_command, cmdmap_t& cmdmap, string format, ostream& ss);
+ bool asok_command(std::string_view admin_command, const cmdmap_t& cmdmap,
+ std::string_view format, std::ostream& ss);
public:
ClassHandler *class_handler = nullptr;
Objecter *m_objecter;
public:
explicit RequestStateHook(Objecter *objecter);
- bool call(std::string command, cmdmap_t& cmdmap, std::string format,
- bufferlist& out) override;
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) override;
};
/**
{
}
-bool Objecter::RequestStateHook::call(std::string command, cmdmap_t& cmdmap,
- std::string format, bufferlist& out)
+bool Objecter::RequestStateHook::call(std::string_view command,
+ const cmdmap_t& cmdmap,
+ std::string_view format,
+ bufferlist& out)
{
Formatter *f = Formatter::create(format, "json-pretty", "json-pretty");
shared_lock rl(m_objecter->rwlock);
return 0;
}
-bool RGWCoroutinesManagerRegistry::call(std::string command, cmdmap_t& cmdmap, std::string format,
- bufferlist& out) {
+bool RGWCoroutinesManagerRegistry::call(std::string_view command,
+ const cmdmap_t& cmdmap,
+ std::string_view format,
+ bufferlist& out) {
RWLock::RLocker rl(lock);
stringstream ss;
JSONFormatter f;
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
#ifndef CEPH_RGW_COROUTINE_H
#define CEPH_RGW_COROUTINE_H
void remove(RGWCoroutinesManager *mgr);
int hook_to_admin_command(const string& command);
- bool call(std::string command, cmdmap_t& cmdmap, std::string format,
- bufferlist& out) override;
-
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) override;
+
void dump(Formatter *f) const;
};
}
}
-bool RGWRados::call(std::string command, cmdmap_t& cmdmap, std::string format,
- bufferlist& out)
+bool RGWRados::call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out)
{
if (command == "cache list"sv) {
std::optional<std::string> filter;
} else if (command == "cache inspect"sv) {
std::unique_ptr<Formatter> f(ceph::Formatter::create(format, "json-pretty"));
if (f) {
- const auto& target = boost::get<std::string>(cmdmap["target"]);
+ const auto& target = boost::get<std::string>(cmdmap.at("target"));
if (call_inspect(target, f.get())) {
f->flush(out);
return true;
return false;
}
} else if (command == "cache erase"sv) {
- const auto& target = boost::get<std::string>(cmdmap["target"]);
+ const auto& target = boost::get<std::string>(cmdmap.at("target"));
if (call_erase(target)) {
return true;
} else {
boost::optional<obj_version> refresh_version);
public:
- bool call(std::string command, cmdmap_t& cmdmap, std::string format,
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format,
bufferlist& out) override final;
protected:
return ss.str();
}
-bool RGWSyncTraceManager::call(std::string command, cmdmap_t& cmdmap, std::string format,
- bufferlist& out) {
+bool RGWSyncTraceManager::call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) {
bool show_history = (command == "sync trace history");
bool show_short = (command == "sync trace active_short");
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
#ifndef CEPH_RGW_SYNC_LOG_H
#define CEPH_RGW_SYNC_LOG_H
void finish_node(RGWSyncTraceNode *node);
int hook_to_admin_command();
- bool call(std::string command, cmdmap_t& cmdmap, std::string format, bufferlist& out);
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) override;
string get_active_names();
};
}
class MyTest : public AdminSocketHook {
- bool call(std::string command, cmdmap_t& cmdmap, std::string format, bufferlist& result) override {
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& result) override {
std::vector<std::string> args;
cmd_getval(g_ceph_context, cmdmap, "args", args);
result.append(command);
}
class MyTest2 : public AdminSocketHook {
- bool call(std::string command, cmdmap_t& cmdmap, std::string format, bufferlist& result) override {
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& result) override {
std::vector<std::string> args;
cmd_getval(g_ceph_context, cmdmap, "args", args);
result.append(command);
BlockingHook() : _lock("BlockingHook::_lock") {}
- bool call(std::string command, cmdmap_t& cmdmap, std::string format, bufferlist& result) override {
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& result) override {
Mutex::Locker l(_lock);
_cond.Wait(_lock);
return true;
}
}
- bool call(std::string command, cmdmap_t& cmdmap, std::string format,
- bufferlist& out) override {
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) override {
Commands::const_iterator i = commands.find(command);
assert(i != commands.end());
Formatter *f = Formatter::create(format);
}
private:
- typedef std::map<std::string, ImageDeleterAdminSocketCommand*> Commands;
+ typedef std::map<std::string, ImageDeleterAdminSocketCommand*,
+ std::less<>> Commands;
AdminSocket *admin_socket;
Commands commands;
};
commands.clear();
}
- bool call(std::string command, cmdmap_t& cmdmap, std::string format,
- bufferlist& out) override {
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) override {
auto i = commands.find(command);
assert(i != commands.end());
Formatter *f = Formatter::create(format);
}
private:
- typedef std::map<std::string, ImageReplayerAdminSocketCommand<I> *> Commands;
+ typedef std::map<std::string, ImageReplayerAdminSocketCommand<I>*,
+ std::less<>> Commands;
AdminSocket *admin_socket;
Commands commands;
}
}
- bool call(std::string command, cmdmap_t& cmdmap, std::string format,
- bufferlist& out) override {
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) override {
Commands::const_iterator i = commands.find(command);
assert(i != commands.end());
Formatter *f = Formatter::create(format);
}
private:
- typedef std::map<std::string, MirrorAdminSocketCommand*> Commands;
+ typedef std::map<std::string, MirrorAdminSocketCommand*, std::less<>> Commands;
AdminSocket *admin_socket;
Commands commands;
}
}
- bool call(std::string command, cmdmap_t& cmdmap, std::string format,
- bufferlist& out) override {
+ bool call(std::string_view command, const cmdmap_t& cmdmap,
+ std::string_view format, bufferlist& out) override {
Commands::const_iterator i = commands.find(command);
assert(i != commands.end());
Formatter *f = Formatter::create(format);
}
private:
- typedef std::map<std::string, PoolReplayerAdminSocketCommand*> Commands;
+ typedef std::map<std::string, PoolReplayerAdminSocketCommand*,
+ std::less<>> Commands;
AdminSocket *admin_socket;
Commands commands;