From: Sage Weil Date: Fri, 2 Jun 2017 18:46:12 +0000 (-0400) Subject: mon: implement '{mon,osd,mds} versions' and '{mon,osd,mds} count-metadata ' X-Git-Tag: v12.1.0~235^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c38221d266c23eda248640303c0f0921242a4634;p=ceph.git mon: implement '{mon,osd,mds} versions' and '{mon,osd,mds} count-metadata ' Summarize running versions of mon, osd, and mds daemons, or similarly tabulate daemons by any other metadata property. Signed-off-by: Sage Weil --- diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh index cf696573e923..dd58b0a7d6aa 100755 --- a/qa/workunits/cephtool/test.sh +++ b/qa/workunits/cephtool/test.sh @@ -708,6 +708,9 @@ function test_mon_misc() ceph mon metadata a ceph mon metadata + ceph mon count-metadata ceph_version + ceph mon versions + ceph node ls } @@ -864,6 +867,8 @@ function test_mon_mds() ceph mds metadata $mds_id done ceph mds metadata + ceph mds versions + ceph mds count-metadata os # XXX mds fail, but how do you undo it? mdsmapfile=$TEMP_DIR/mdsmap.$$ @@ -1352,6 +1357,10 @@ function test_mon_osd() expect_false ceph osd tree in out expect_false ceph osd tree up foo + ceph osd metadata + ceph osd count-metadata os + ceph osd versions + ceph osd perf ceph osd blocked-by diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc index b9937a48341f..b9c1a5294f9d 100644 --- a/src/mon/MDSMonitor.cc +++ b/src/mon/MDSMonitor.cc @@ -969,6 +969,20 @@ bool MDSMonitor::preprocess_command(MonOpRequestRef op) f->close_section(); } f->flush(ds); + } else if (prefix == "mds versions") { + if (!f) + f.reset(Formatter::create("json-pretty")); + count_metadata("ceph_version", f.get()); + f->flush(ds); + r = 0; + } else if (prefix == "mds 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(ds); + r = 0; } else if (prefix == "mds getmap") { epoch_t e; int64_t epocharg; @@ -1774,6 +1788,26 @@ int MDSMonitor::load_metadata(map& m) return 0; } +void MDSMonitor::count_metadata(const string& field, Formatter *f) +{ + map by_val; + map meta; + load_metadata(meta); + for (auto& p : meta) { + auto q = p.second.find(field); + if (q == p.second.end()) { + by_val["unknown"]++; + } else { + by_val[q->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 MDSMonitor::dump_metadata(const std::string &who, Formatter *f, ostream& err) { assert(f); diff --git a/src/mon/MDSMonitor.h b/src/mon/MDSMonitor.h index 9fca6af0dbdd..05946b51c3c8 100644 --- a/src/mon/MDSMonitor.h +++ b/src/mon/MDSMonitor.h @@ -138,6 +138,7 @@ class MDSMonitor : public PaxosService { void update_metadata(mds_gid_t gid, const Metadata& metadata); void remove_from_metadata(MonitorDBStore::TransactionRef t); int load_metadata(map& m); + void count_metadata(const string& field, Formatter *f); // MDS daemon GID to latest health state from that GID std::map pending_daemon_health; diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 610564ff11de..9ae60462189c 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -253,6 +253,12 @@ COMMAND_WITH_FLAG("mon sync force " \ COMMAND("mon metadata name=id,type=CephString,req=false", "fetch metadata for mon ", "mon", "r", "cli,rest") +COMMAND("mon count-metadata name=property,type=CephString", + "count mons by metadata field property", + "mon", "r", "cli,rest") +COMMAND("mon versions", + "check running versions of monitors", + "mon", "r", "cli,rest") /* @@ -273,6 +279,12 @@ COMMAND_WITH_FLAG("mds getmap " \ COMMAND("mds metadata name=who,type=CephString,req=false", "fetch metadata for mds ", "mds", "r", "cli,rest") +COMMAND("mds count-metadata name=property,type=CephString", + "count MDSs by metadata field property", + "mds", "r", "cli,rest") +COMMAND("mds versions", + "check running versions of MDSs", + "mds", "r", "cli,rest") COMMAND_WITH_FLAG("mds tell " \ "name=who,type=CephString " \ "name=args,type=CephString,n=N", \ @@ -442,6 +454,12 @@ COMMAND("osd metadata " \ "name=id,type=CephOsdName,req=false", \ "fetch metadata for osd {id} (default all)", \ "osd", "r", "cli,rest") +COMMAND("osd count-metadata name=property,type=CephString", + "count OSDs by metadata field property", + "osd", "r", "cli,rest") +COMMAND("osd versions", \ + "check running versions of OSDs", + "osd", "r", "cli,rest") COMMAND("osd map " \ "name=pool,type=CephPoolname " \ "name=object,type=CephObjectname " \ diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index d4b4f87133ec..5a6094531830 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -2970,7 +2970,9 @@ void Monitor::handle_command(MonOpRequestRef op) prefix != "mon compact" && prefix != "mon scrub" && prefix != "mon sync force" && - prefix != "mon metadata") { + prefix != "mon metadata" && + prefix != "mon versions" && + prefix != "mon count-metadata") { monmon()->dispatch(op); return; } @@ -3205,6 +3207,24 @@ void Monitor::handle_command(MonOpRequestRef op) f->flush(ds); rdata.append(ds); rs = ""; + } else if (prefix == "mon versions") { + if (!f) + f.reset(Formatter::create("json-pretty")); + count_metadata("ceph_version", f.get()); + f->flush(ds); + rdata.append(ds); + rs = ""; + r = 0; + } else if (prefix == "mon 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(ds); + rdata.append(ds); + rs = ""; + r = 0; } else if (prefix == "quorum_status") { // make sure our map is readable and up to date if (!is_leader() && !is_peon()) { @@ -4701,6 +4721,26 @@ int Monitor::get_mon_metadata(int mon, Formatter *f, ostream& err) return 0; } +void Monitor::count_metadata(const string& field, Formatter *f) +{ + map meta; + load_metadata(meta); + map by_val; + for (auto& p : meta) { + auto q = p.second.find(field); + if (q == p.second.end()) { + by_val["unknown"]++; + } else { + by_val[q->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 Monitor::print_nodes(Formatter *f, ostream& err) { map metadata; diff --git a/src/mon/Monitor.h b/src/mon/Monitor.h index 3f8b5950888e..1831f9fb603c 100644 --- a/src/mon/Monitor.h +++ b/src/mon/Monitor.h @@ -861,6 +861,7 @@ public: void update_mon_metadata(int from, Metadata&& m); int load_metadata(map& m); + void count_metadata(const string& field, Formatter *f); // features static CompatSet get_initial_supported_features(); diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 1c85408ea125..408373bf8e57 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -1350,6 +1350,28 @@ int OSDMonitor::load_metadata(int osd, map& m, ostream *err) return 0; } +void OSDMonitor::count_metadata(const string& field, Formatter *f) +{ + map by_val; + for (int osd = 0; osd < osdmap.get_max_osd(); ++osd) { + if (osdmap.is_up(osd)) { + map meta; + load_metadata(osd, 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 OSDMonitor::get_osd_objectstore_type(int osd, string *type) { map metadata; @@ -4172,6 +4194,20 @@ bool OSDMonitor::preprocess_command(MonOpRequestRef op) f->close_section(); } f->flush(rdata); + } else if (prefix == "osd versions") { + if (!f) + f.reset(Formatter::create("json-pretty")); + count_metadata("ceph_version", f.get()); + f->flush(rdata); + r = 0; + } else if (prefix == "osd 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 if (prefix == "osd map") { string poolstr, objstr, namespacestr; cmd_getval(g_ceph_context, cmdmap, "pool", poolstr); diff --git a/src/mon/OSDMonitor.h b/src/mon/OSDMonitor.h index fe1afa225479..d57200294a65 100644 --- a/src/mon/OSDMonitor.h +++ b/src/mon/OSDMonitor.h @@ -429,6 +429,7 @@ private: OpTracker op_tracker; int load_metadata(int osd, map& m, ostream *err); + void count_metadata(const string& field, Formatter *f); int get_osd_objectstore_type(int osd, std::string *type); bool is_pool_currently_all_bluestore(int64_t pool_id, const pg_pool_t &pool, ostream *err);