From 7841455ca63c7bb9e01f9976693c804d2e1a6439 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Sat, 29 Aug 2015 22:45:41 +0800 Subject: [PATCH] Mon: Make ceph osd metadata support dump all osds Impl #12801 Signed-off-by: Haomai Wang --- doc/man/8/ceph.rst | 2 +- src/mon/MonCommands.h | 4 ++-- src/mon/OSDMonitor.cc | 33 ++++++++++++++++++++------- src/test/pybind/test_ceph_argparse.py | 2 +- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/doc/man/8/ceph.rst b/doc/man/8/ceph.rst index a1d31884f792..38d782d9f6cf 100644 --- a/doc/man/8/ceph.rst +++ b/doc/man/8/ceph.rst @@ -829,7 +829,7 @@ Subcommand ``metadata`` fetches metadata for osd . Usage:: - ceph osd metadata + ceph osd metadata {int[0-]} (default all) Subcommand ``out`` sets osd(s) [...] out. diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index e4da778cbd35..0c09638a22ee 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -435,8 +435,8 @@ COMMAND("osd find " \ "find osd 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 ", \ + "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 " \ diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 756ff0dd0771..63b19f3652fd 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -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 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; iopen_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; diff --git a/src/test/pybind/test_ceph_argparse.py b/src/test/pybind/test_ceph_argparse.py index 6bd2b0835263..fae1c93a8adc 100755 --- a/src/test/pybind/test_ceph_argparse.py +++ b/src/test/pybind/test_ceph_argparse.py @@ -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') -- 2.47.3