From 9653098a20a46c66756218c5e8ae0b2c0b8b3730 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 2 Oct 2008 11:15:08 -0700 Subject: [PATCH] mon: allow new arguments to be sent to running mon, mds, osd via cmonctl --- src/config.cc | 21 ++++++++++++++++++-- src/config.h | 3 ++- src/mds/MDS.cc | 8 ++++++++ src/mon/MDSMonitor.cc | 18 +++++++++++++++++ src/mon/Monitor.cc | 46 +++++++++++++++++++++++++++++++++++++++++-- src/mon/Monitor.h | 8 ++++++++ src/mon/OSDMonitor.cc | 18 +++++++++++++++++ src/osd/OSD.cc | 8 +++++++- 8 files changed, 124 insertions(+), 6 deletions(-) diff --git a/src/config.cc b/src/config.cc index d342e5fc5a96d..2b5bf745df9cf 100644 --- a/src/config.cc +++ b/src/config.cc @@ -572,7 +572,24 @@ bool parse_ip_port(const char *s, entity_addr_t& a) -void parse_config_options(std::vector& args) +void parse_config_option_string(string& s) +{ + char b[s.length()+1]; + strcpy(b, s.c_str()); + vector nargs; + char *p = b; + while (*p) { + nargs.push_back(p); + while (*p && *p != ' ') p++; + if (!*p) + break; + *p++ = 0; + while (*p && *p == ' ') p++; + } + parse_config_options(nargs, false); +} + +void parse_config_options(std::vector& args, bool open) { std::vector nargs; @@ -1129,7 +1146,7 @@ void parse_config_options(std::vector& args) g_conf.dout_dir = 0; } */ - if (g_conf.dout_dir && g_conf.daemonize) { + if (g_conf.dout_dir && g_conf.daemonize && open) { char fn[80]; char hostname[80]; gethostname(hostname, 79); diff --git a/src/config.h b/src/config.h index 44faf4362581b..49e27a9ea3483 100644 --- a/src/config.h +++ b/src/config.h @@ -350,7 +350,8 @@ void argv_to_vec(int argc, const char **argv, void vec_to_argv(std::vector& args, int& argc, const char **&argv); -void parse_config_options(std::vector& args); +void parse_config_options(std::vector& args, bool open=true); +void parse_config_option_string(string& s); extern bool parse_ip_port(const char *s, entity_addr_t& addr); diff --git a/src/mds/MDS.cc b/src/mds/MDS.cc index 1413ef59f1f8e..5389ba97ce5c3 100644 --- a/src/mds/MDS.cc +++ b/src/mds/MDS.cc @@ -60,6 +60,8 @@ #include "messages/MMDSTableRequest.h" +#include "messages/MMonCommand.h" + #include "config.h" #define dout(l) if (l<=g_conf.debug || l <= g_conf.debug_mds) *_dout << dbeginl << g_clock.now() << " mds" << whoami << " " @@ -1174,6 +1176,12 @@ void MDS::_dispatch(Message *m) handle_mds_beacon((MMDSBeacon*)m); break; + // misc + case MSG_MON_COMMAND: + parse_config_option_string(((MMonCommand*)m)->cmd[0]); + delete m; + break; + default: dout(1) << "MDS unknown messge " << m->get_type() << dendl; assert(0); diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc index 5a668a12a93ca..0132642f46d62 100644 --- a/src/mon/MDSMonitor.cc +++ b/src/mon/MDSMonitor.cc @@ -523,6 +523,24 @@ bool MDSMonitor::preprocess_command(MMonCommand *m) ss << "got mdsmap epoch " << mdsmap.get_epoch(); r = 0; } + else if (m->cmd[1] == "injectargs" && m->cmd.size() == 4) { + if (m->cmd[2] == "*") { + for (int i=0; iinject_args(mdsmap.get_inst(i), m->cmd[3]); + r = 0; + ss << "ok bcast"; + } else { + errno = 0; + int who = strtol(m->cmd[2].c_str(), 0, 10); + if (!errno && who >= 0 && mdsmap.is_active(who)) { + mon->inject_args(mdsmap.get_inst(who), m->cmd[3]); + r = 0; + ss << "ok"; + } else + ss << "specify mds number or *"; + } + } } if (r != -1) { diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 2ddb9e1d3c2fb..de08031c5ee8b 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -210,6 +210,7 @@ void Monitor::handle_command(MMonCommand *m) dout(0) << "handle_command " << *m << dendl; string rs; + int r = -EINVAL; if (!m->cmd.empty()) { if (m->cmd[0] == "mds") { mdsmon->dispatch(m); @@ -233,11 +234,39 @@ void Monitor::handle_command(MMonCommand *m) reply_command(m, 0, "initiating cluster shutdown"); return; } - rs = "unrecognized subsystem"; + + if (m->cmd[0] == "_injectargs") { + parse_config_option_string(m->cmd[0]); + return; + } + if (m->cmd[0] == "mon") { + if (m->cmd[1] == "injectargs" && m->cmd.size() == 4) { + vector args(2); + args[0] = "_injectargs"; + args[1] = m->cmd[3]; + if (m->cmd[2] == "*") { + for (unsigned i=0; isize(); i++) + inject_args(monmap->get_inst(i), args); + r = 0; + rs = "ok bcast"; + } else { + errno = 0; + int who = strtol(m->cmd[2].c_str(), 0, 10); + if (!errno && who >= 0) { + inject_args(monmap->get_inst(who), args); + r = 0; + rs = "ok"; + } else + rs = "specify mon number or *"; + } + } else + rs = "unrecognized mon command"; + } else + rs = "unrecognized subsystem"; } else rs = "no command"; - reply_command(m, -EINVAL, rs); + reply_command(m, r, rs); } void Monitor::reply_command(MMonCommand *m, int rc, const string &rs) @@ -254,6 +283,18 @@ void Monitor::reply_command(MMonCommand *m, int rc, const string &rs, bufferlist delete m; } + +void Monitor::inject_args(const entity_inst_t& inst, vector& args) +{ + dout(10) << "inject_args " << inst << " " << args << dendl; + MMonCommand *c = new MMonCommand(monmap->fsid); + c->cmd = args; + messenger->send_message(c, inst); +} + + + + void Monitor::stop_cluster() { dout(0) << "stop_cluster -- initiating shutdown" << dendl; @@ -507,3 +548,4 @@ int Monitor::mkfs() } + diff --git a/src/mon/Monitor.h b/src/mon/Monitor.h index 434b12fa9a98c..81b3742866142 100644 --- a/src/mon/Monitor.h +++ b/src/mon/Monitor.h @@ -127,6 +127,14 @@ public: void reply_command(MMonCommand *m, int rc, const string &rs); void reply_command(MMonCommand *m, int rc, const string &rs, bufferlist& rdata); + + void inject_args(const entity_inst_t& inst, string& args) { + vector a(1); + a[0] = args; + inject_args(inst, a); + } + void inject_args(const entity_inst_t& inst, vector& args); + public: struct C_Command : public Context { Monitor *mon; diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 05ed17755f071..a1a662c407b4b 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -868,6 +868,24 @@ bool OSDMonitor::preprocess_command(MMonCommand *m) ss << "max_osd = " << osdmap.get_max_osd() << " in epoch " << osdmap.get_epoch(); r = 0; } + else if (m->cmd[1] == "injectargs" && m->cmd.size() == 4) { + if (m->cmd[2] == "*") { + for (int i=0; iinject_args(osdmap.get_inst(i), m->cmd[3]); + r = 0; + ss << "ok bcast"; + } else { + errno = 0; + int who = strtol(m->cmd[2].c_str(), 0, 10); + if (!errno && who >= 0 && osdmap.is_up(who)) { + mon->inject_args(osdmap.get_inst(who), m->cmd[3]); + r = 0; + ss << "ok"; + } else + ss << "specify osd number or *"; + } + } } if (r != -1) { string rs; diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index fde1da3e5cc11..5732da9c796c3 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -59,6 +59,8 @@ #include "messages/MOSDAlive.h" +#include "messages/MMonCommand.h" + #include "messages/MPGStats.h" #include "messages/MPGStatsAck.h" @@ -1290,7 +1292,11 @@ void OSD::dispatch(Message *m) case MSG_PGSTATSACK: handle_pgstats_ack((MPGStatsAck*)m); break; - + + case MSG_MON_COMMAND: + parse_config_option_string(((MMonCommand*)m)->cmd[0]); + delete m; + break; // -- need OSDMap -- -- 2.39.5