]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: implement '{mon,osd,mds} versions' and '{mon,osd,mds} count-metadata <field>' 15436/head
authorSage Weil <sage@redhat.com>
Fri, 2 Jun 2017 18:46:12 +0000 (14:46 -0400)
committerSage Weil <sage@redhat.com>
Fri, 2 Jun 2017 18:46:12 +0000 (14:46 -0400)
Summarize running versions of mon, osd, and mds daemons, or similarly
tabulate daemons by any other metadata property.

Signed-off-by: Sage Weil <sage@redhat.com>
qa/workunits/cephtool/test.sh
src/mon/MDSMonitor.cc
src/mon/MDSMonitor.h
src/mon/MonCommands.h
src/mon/Monitor.cc
src/mon/Monitor.h
src/mon/OSDMonitor.cc
src/mon/OSDMonitor.h

index cf696573e923b43f31a2e724c63b4fd65369683e..dd58b0a7d6aaacd8bae2482467ab217819f2f00f 100755 (executable)
@@ -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
 
index b9937a48341ff22a60d60a17f94dc020d0320207..b9c1a5294f9d377f95ee950c0eca83bae9b32347 100644 (file)
@@ -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<mds_gid_t, Metadata>& m)
   return 0;
 }
 
+void MDSMonitor::count_metadata(const string& field, Formatter *f)
+{
+  map<string,int> by_val;
+  map<mds_gid_t,Metadata> 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);
index 9fca6af0dbddc79cf7995f30b8a2bc9d72756729..05946b51c3c81abae0379639b40f682301fd7365 100644 (file)
@@ -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<mds_gid_t, Metadata>& m);
+  void count_metadata(const string& field, Formatter *f);
 
   // MDS daemon GID to latest health state from that GID
   std::map<uint64_t, MDSHealth> pending_daemon_health;
index 610564ff11de5fabeb13225665a92ad3d1a6a7d1..9ae60462189c86afb17127ad3ac66290a1e5fdfb 100644 (file)
@@ -253,6 +253,12 @@ COMMAND_WITH_FLAG("mon sync force " \
 COMMAND("mon metadata name=id,type=CephString,req=false",
        "fetch metadata for mon <id>",
        "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 <who>",
        "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 " \
index d4b4f87133ec94d64a35943101ef0fe86faef6da..5a60945318309b85ae4211d767b935a15336b59b 100644 (file)
@@ -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<int, Metadata> meta;
+  load_metadata(meta);
+  map<string,int> 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<int, Metadata> metadata;
index 3f8b5950888e0d127191afd5cf58fee33a22b35b..1831f9fb603c53e6225e9948b83cd81a7ca90cb2 100644 (file)
@@ -861,6 +861,7 @@ public:
 
   void update_mon_metadata(int from, Metadata&& m);
   int load_metadata(map<int, Metadata>& m);
+  void count_metadata(const string& field, Formatter *f);
 
   // features
   static CompatSet get_initial_supported_features();
index 1c85408ea125024042effc76ae00650306872df0..408373bf8e5780b28115301247b5c2d4a12dfad1 100644 (file)
@@ -1350,6 +1350,28 @@ int OSDMonitor::load_metadata(int osd, map<string, string>& m, ostream *err)
   return 0;
 }
 
+void OSDMonitor::count_metadata(const string& field, Formatter *f)
+{
+  map<string,int> by_val;
+  for (int osd = 0; osd < osdmap.get_max_osd(); ++osd) {
+    if (osdmap.is_up(osd)) {
+      map<string,string> 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<string, string> 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);
index fe1afa225479c19c1e749ef40375bc6ef2f62a42..d57200294a65668b11670f332bda1a56790f2d10 100644 (file)
@@ -429,6 +429,7 @@ private:
   OpTracker op_tracker;
 
   int load_metadata(int osd, map<string, string>& 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);