]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/MgrMonitor: 'mgr metadata', 'mgr versions', 'mgr count-metadata'
authorSage Weil <sage@redhat.com>
Thu, 20 Jul 2017 19:59:57 +0000 (15:59 -0400)
committerSage Weil <sage@redhat.com>
Fri, 21 Jul 2017 15:25:04 +0000 (11:25 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
doc/release-notes.rst
src/mon/MgrMap.h
src/mon/MgrMonitor.cc
src/mon/MgrMonitor.h
src/mon/MonCommands.h

index 3c2dd583df69186c1b38956ddd094b3b5f704aa8..086f358c4136fe032dcd4a55b342f06f709d7b9d 100644 (file)
@@ -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 <property>`` 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 <property>`` 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 <release>`` replaces the old
index 3841840cff7a94644d0741ed5db26cf728e3059f..01ed2515c34a8a811a30feb8b8d5c9f9a90c12fa 100644 (file)
@@ -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<std::string> get_all_names() const {
+    std::set<std::string> 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);
index 3a18d6819912eada5f61843fc551ce9cc1120494..3e4562da0a5c4de03d9473b41ff8805448d61d70 100644 (file)
@@ -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<Formatter> 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<string, string>& 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<string,int> by_val;
+  std::set<string> ls = map.get_all_names();
+  for (auto& name : ls) {
+    std::map<string,string> 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<string,string> 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;
+}
 
index 639d31163aaae1b3ff9f687aa39648e32762a2ae..44f28379ccefb9db250fec0cfd382310b48b263d 100644 (file)
@@ -103,6 +103,11 @@ public:
     return command_descs;
   }
 
+  int load_metadata(const string& name, std::map<string, string>& 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;
 };
 
index a9055041e6c586570cebda51c20a5d5ec1870308..7051056fd44470ddab351a1490dc99b9acb70b16 100644 (file)
@@ -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")