From: Sage Weil Date: Thu, 18 May 2017 16:05:13 +0000 (-0400) Subject: mon/MgrMonitor: add 'mgr dump [epoch]' command X-Git-Tag: v12.1.0~10^2~57^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F15158%2Fhead;p=ceph.git mon/MgrMonitor: add 'mgr dump [epoch]' command Signed-off-by: Sage Weil --- diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh index 92a8db1f3c54..07b8df941cb7 100755 --- a/qa/workunits/cephtool/test.sh +++ b/qa/workunits/cephtool/test.sh @@ -680,6 +680,8 @@ function test_mon_misc() ceph log "$mymsg" ceph_watch_wait "$mymsg" + ceph mgr dump + ceph mon metadata a ceph mon metadata ceph node ls diff --git a/src/mon/MgrMonitor.cc b/src/mon/MgrMonitor.cc index b36da2fce57c..0eda70d994db 100644 --- a/src/mon/MgrMonitor.cc +++ b/src/mon/MgrMonitor.cc @@ -444,8 +444,60 @@ void MgrMonitor::drop_standby(uint64_t gid) bool MgrMonitor::preprocess_command(MonOpRequestRef op) { - return false; + MMonCommand *m = static_cast(op->get_req()); + std::stringstream ss; + bufferlist rdata; + + std::map cmdmap; + if (!cmdmap_from_json(m->cmd, &cmdmap, ss)) { + string rs = ss.str(); + mon->reply_command(op, -EINVAL, rs, rdata, get_last_committed()); + return true; + } + + MonSession *session = m->get_session(); + if (!session) { + mon->reply_command(op, -EACCES, "access denied", rdata, + get_last_committed()); + return true; + } + string format; + cmd_getval(g_ceph_context, cmdmap, "format", format, string("json-pretty")); + boost::scoped_ptr f(Formatter::create(format)); + + string prefix; + cmd_getval(g_ceph_context, cmdmap, "prefix", prefix); + int r = 0; + + if (prefix == "mgr dump") { + int64_t epoch = 0; + cmd_getval(g_ceph_context, cmdmap, "epoch", epoch, (int64_t)map.get_epoch()); + if (epoch == (int64_t)map.get_epoch()) { + f->dump_object("mgrmap", map); + } else { + bufferlist bl; + int err = get_version(epoch, bl); + if (err == -ENOENT) { + r = -ENOENT; + ss << "there is no map for epoch " << epoch; + goto reply; + } + MgrMap m; + auto p = bl.begin(); + m.decode(p); + f->dump_object("mgrmap", m); + } + f->flush(rdata); + } else { + return false; + } + +reply: + string rs; + getline(ss, rs); + mon->reply_command(op, r, rs, rdata, get_last_committed()); + return true; } bool MgrMonitor::prepare_command(MonOpRequestRef op) diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index c7b932690b91..2c91d79c5d4c 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -840,5 +840,9 @@ COMMAND("config-key dump", "dump keys and values", "config-key", "r", "cli,rest" /* * mon/MgrMonitor.cc */ +COMMAND("mgr dump " \ + "name=epoch,type=CephInt,range=0,req=false", \ + "dump the latest MgrMap", \ + "mgr", "rw", "cli,rest") COMMAND("mgr fail name=who,type=CephString", \ "treat the named manager daemon as failed", "mgr", "rw", "cli,rest")