]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Mon: Make ceph osd metadata support dump all osds 5712/head
authorHaomai Wang <haomaiwang@gmail.com>
Sat, 29 Aug 2015 14:45:41 +0000 (22:45 +0800)
committerHaomai Wang <haomaiwang@gmail.com>
Sun, 30 Aug 2015 12:56:26 +0000 (20:56 +0800)
Impl #12801
Signed-off-by: Haomai Wang <haomaiwang@gmail.com>
doc/man/8/ceph.rst
src/mon/MonCommands.h
src/mon/OSDMonitor.cc
src/test/pybind/test_ceph_argparse.py

index a1d31884f7928d2ad740b631e969013bb0e60239..38d782d9f6cf331ce66d0371392f8caf72f8224b 100644 (file)
@@ -829,7 +829,7 @@ Subcommand ``metadata`` fetches metadata for osd <id>.
 
 Usage::
 
-       ceph osd metadata <int[0-]>
+       ceph osd metadata {int[0-]} (default all)
 
 Subcommand ``out`` sets osd(s) <id> [<id>...] out.
 
index e4da778cbd35417c67d1228b164ef5b1187e82cd..0c09638a22ee6ffc4bd6e8f80275d3104e899b93 100644 (file)
@@ -435,8 +435,8 @@ COMMAND("osd find " \
        "find osd <id> in the CRUSH map and show its location", \
        "osd", "r", "cli,rest")
 COMMAND("osd metadata " \
-       "name=id,type=CephInt,range=0", \
-       "fetch metadata for osd <id>", \
+       "name=id,type=CephInt,range=0,req=false", \
+       "fetch metadata for osd {id} (default all)", \
        "osd", "r", "cli,rest")
 COMMAND("osd map " \
        "name=pool,type=CephPoolname " \
index 756ff0dd077174d1f63205c411f84bb6c26a091c..63b19f3652fd133e67c9a214829169e4f8de85d9 100644 (file)
@@ -3058,14 +3058,15 @@ bool OSDMonitor::preprocess_command(MonOpRequestRef op)
     f->close_section();
     f->flush(rdata);
   } else if (prefix == "osd metadata") {
-    int64_t osd;
-    if (!cmd_getval(g_ceph_context, cmdmap, "id", osd)) {
+    int64_t osd = -1;
+    if (cmd_vartype_stringify(cmdmap["id"]).size() &&
+        !cmd_getval(g_ceph_context, cmdmap, "id", osd)) {
       ss << "unable to parse osd id value '"
          << cmd_vartype_stringify(cmdmap["id"]) << "'";
       r = -EINVAL;
       goto reply;
     }
-    if (!osdmap.exists(osd)) {
+    if (osd >= 0 && !osdmap.exists(osd)) {
       ss << "osd." << osd << " does not exist";
       r = -ENOENT;
       goto reply;
@@ -3073,11 +3074,27 @@ bool OSDMonitor::preprocess_command(MonOpRequestRef op)
     string format;
     cmd_getval(g_ceph_context, cmdmap, "format", format);
     boost::scoped_ptr<Formatter> f(Formatter::create(format, "json-pretty", "json-pretty"));
-    f->open_object_section("osd_metadata");
-    r = dump_osd_metadata(osd, f.get(), &ss);
-    if (r < 0)
-      goto reply;
-    f->close_section();
+    if (osd >= 0) {
+      f->open_object_section("osd_metadata");
+      f->dump_unsigned("id", osd);
+      r = dump_osd_metadata(osd, f.get(), &ss);
+      if (r < 0)
+        goto reply;
+      f->close_section();
+    } else {
+      f->open_array_section("osd_metadata");
+      for (int i=0; i<osdmap.get_max_osd(); ++i) {
+        if (osdmap.exists(i)) {
+          f->open_object_section("osd");
+          f->dump_unsigned("id", i);
+          r = dump_osd_metadata(i, f.get(), NULL);
+          if (r < 0)
+            goto reply;
+          f->close_section();
+        }
+      }
+      f->close_section();
+    }
     f->flush(rdata);
   } else if (prefix == "osd map") {
     string poolstr, objstr, namespacestr;
index 6bd2b08352636154208d628d8bc198a6f8fba5f6..fae1c93a8adc95fa438969f079452b931bd56455 100755 (executable)
@@ -552,7 +552,7 @@ class TestOSD(TestArgparse):
                                                     'toomany']))
 
     def test_metadata(self):
-        self.check_1_natural_arg('osd', 'metadata')
+        self.check_0_or_1_natural_arg('osd', 'metadata')
 
     def test_scrub(self):
         self.check_1_string_arg('osd', 'scrub')