From: Sage Weil Date: Thu, 20 Jul 2017 19:59:57 +0000 (-0400) Subject: mon/MgrMonitor: 'mgr metadata', 'mgr versions', 'mgr count-metadata' X-Git-Tag: v12.1.2~164^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=831e2a75a6a71df7196ee2452a26f5fb648ce6d7;p=ceph.git mon/MgrMonitor: 'mgr metadata', 'mgr versions', 'mgr count-metadata' Signed-off-by: Sage Weil --- diff --git a/doc/release-notes.rst b/doc/release-notes.rst index 3c2dd583df69..086f358c4136 100644 --- a/doc/release-notes.rst +++ b/doc/release-notes.rst @@ -158,10 +158,12 @@ Major Changes from Kraken * *CLI changes*: - The ``ceph -s`` or ``ceph status`` command has a fresh look. - - ``ceph {osd,mds,mon} versions`` summarizes versions of running daemons. - - ``ceph {osd,mds,mon} count-metadata `` similarly + - ``ceph mgr metadata`` will dump metadata associated with each mgr + daemon. + - ``ceph {osd,mds,mon,mgr} versions`` summarizes versions of running daemons. + - ``ceph {osd,mds,mon,mgr} count-metadata `` similarly tabulates any other daemon metadata visible via the ``ceph - {osd,mds,mon} metadata`` commands. + {osd,mds,mon,mgr} metadata`` commands. - ``ceph features`` summarizes features and releases of connected clients and daemons. - ``ceph osd require-osd-release `` replaces the old diff --git a/src/mon/MgrMap.h b/src/mon/MgrMap.h index 3841840cff7a..01ed2515c34a 100644 --- a/src/mon/MgrMap.h +++ b/src/mon/MgrMap.h @@ -95,6 +95,29 @@ public: return true; } + bool have_name(const string& name) const { + if (active_name == name) { + return true; + } + for (auto& p : standbys) { + if (p.second.name == name) { + return true; + } + } + return false; + } + + std::set get_all_names() const { + std::set ls; + if (active_name.size()) { + ls.insert(active_name); + } + for (auto& p : standbys) { + ls.insert(p.second.name); + } + return ls; + } + void encode(bufferlist& bl, uint64_t features) const { ENCODE_START(2, 1, bl); diff --git a/src/mon/MgrMonitor.cc b/src/mon/MgrMonitor.cc index 3a18d6819912..3e4562da0a5c 100644 --- a/src/mon/MgrMonitor.cc +++ b/src/mon/MgrMonitor.cc @@ -684,6 +684,58 @@ bool MgrMonitor::preprocess_command(MonOpRequestRef op) } f->close_section(); f->flush(rdata); + } else if (prefix == "mgr metadata") { + string name; + cmd_getval(g_ceph_context, cmdmap, "id", name); + if (name.size() > 0 && !map.have_name(name)) { + ss << "mgr." << name << " does not exist"; + r = -ENOENT; + goto reply; + } + string format; + cmd_getval(g_ceph_context, cmdmap, "format", format); + boost::scoped_ptr f(Formatter::create(format, "json-pretty", "json-pretty")); + if (name.size()) { + f->open_object_section("mgr_metadata"); + f->dump_string("id", name); + r = dump_metadata(name, f.get(), &ss); + if (r < 0) + goto reply; + f->close_section(); + } else { + r = 0; + f->open_array_section("mgr_metadata"); + for (auto& i : map.get_all_names()) { + f->open_object_section("mgr"); + f->dump_string("id", i); + r = dump_metadata(i, f.get(), NULL); + if (r == -EINVAL || r == -ENOENT) { + // Drop error, continue to get other daemons' metadata + dout(4) << "No metadata for mgr." << i << dendl; + r = 0; + } else if (r < 0) { + // Unexpected error + goto reply; + } + f->close_section(); + } + f->close_section(); + } + f->flush(rdata); + } else if (prefix == "mgr versions") { + if (!f) + f.reset(Formatter::create("json-pretty")); + count_metadata("ceph_version", f.get()); + f->flush(rdata); + r = 0; + } else if (prefix == "mgr count-metadata") { + if (!f) + f.reset(Formatter::create("json-pretty")); + string field; + cmd_getval(g_ceph_context, cmdmap, "property", field); + count_metadata(field, f.get()); + f->flush(rdata); + r = 0; } else { return false; } @@ -826,4 +878,54 @@ void MgrMonitor::on_shutdown() cancel_timer(); } +int MgrMonitor::load_metadata(const string& name, std::map& m, + ostream *err) +{ + bufferlist bl; + int r = mon->store->get(MGR_METADATA_PREFIX, name, bl); + if (r < 0) + return r; + try { + bufferlist::iterator p = bl.begin(); + ::decode(m, p); + } + catch (buffer::error& e) { + if (err) + *err << "mgr." << name << " metadata is corrupt"; + return -EIO; + } + return 0; +} + +void MgrMonitor::count_metadata(const string& field, Formatter *f) +{ + std::map by_val; + std::set ls = map.get_all_names(); + for (auto& name : ls) { + std::map meta; + load_metadata(name, meta, nullptr); + auto p = meta.find(field); + if (p == meta.end()) { + by_val["unknown"]++; + } else { + by_val[p->second]++; + } + } + f->open_object_section(field.c_str()); + for (auto& p : by_val) { + f->dump_int(p.first.c_str(), p.second); + } + f->close_section(); +} + +int MgrMonitor::dump_metadata(const string& name, Formatter *f, ostream *err) +{ + std::map m; + if (int r = load_metadata(name, m, err)) + return r; + for (auto& p : m) { + f->dump_string(p.first.c_str(), p.second); + } + return 0; +} diff --git a/src/mon/MgrMonitor.h b/src/mon/MgrMonitor.h index 639d31163aaa..44f28379ccef 100644 --- a/src/mon/MgrMonitor.h +++ b/src/mon/MgrMonitor.h @@ -103,6 +103,11 @@ public: return command_descs; } + int load_metadata(const string& name, std::map& m, + ostream *err); + int dump_metadata(const string& name, Formatter *f, ostream *err); + void count_metadata(const string& field, Formatter *f); + friend class C_Updated; }; diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index a9055041e6c5..7051056fd444 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -1017,3 +1017,12 @@ COMMAND("mgr module enable " \ COMMAND("mgr module disable " \ "name=module,type=CephString", "disable mgr module", "mgr", "rw", "cli,rest") +COMMAND("mgr metadata name=id,type=CephString,req=false", + "dump metadata for all daemons or a specific daemon", + "mgr", "r", "cli,rest") +COMMAND("mgr count-metadata name=property,type=CephString", + "count ceph-mgr daemons by metadata field property", + "mgr", "r", "cli,rest") +COMMAND("mgr versions", \ + "check running versions of ceph-mgr daemons", + "mgr", "r", "cli,rest")