From b24fa931b2389421a7cf77835be75d2b226bd3f8 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 18 May 2017 12:05:13 -0400 Subject: [PATCH] mon/MgrMonitor: add 'mgr dump [epoch]' command Signed-off-by: Sage Weil --- qa/workunits/cephtool/test.sh | 2 ++ src/mon/MgrMonitor.cc | 54 ++++++++++++++++++++++++++++++++++- src/mon/MonCommands.h | 4 +++ 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh index 92a8db1f3c54f..07b8df941cb70 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 b36da2fce57c4..0eda70d994dbc 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 c7b932690b91e..2c91d79c5d4ca 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") -- 2.39.5