From: xie xingguo Date: Sat, 1 Jul 2017 07:56:50 +0000 (+0800) Subject: mon/OSDMonitor: "osd crush ls-osd" support X-Git-Tag: v12.1.1~42^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d54722f6adf31f907e0c02201f8863e90e2829e0;p=ceph.git mon/OSDMonitor: "osd crush ls-osd" support Signed-off-by: xie xingguo --- diff --git a/src/crush/CrushWrapper.h b/src/crush/CrushWrapper.h index b5bfebb76578..56b26dbd075a 100644 --- a/src/crush/CrushWrapper.h +++ b/src/crush/CrushWrapper.h @@ -510,7 +510,19 @@ public: class_map[i] = c; return c; } - + void get_devices_by_class(const string &name, set *devices) const { + assert(devices); + devices->clear(); + if (!class_exists(name)) { + return; + } + auto cid = get_class_id(name); + for (auto& p : class_map) { + if (p.first >= 0 && p.second == cid) { + devices->insert(p.first); + } + } + } int can_rename_item(const string& srcname, const string& dstname, ostream *ss) const; diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index bfdf0041ebaf..017e3ebb54b2 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -637,6 +637,10 @@ COMMAND("osd crush class rename " \ COMMAND("osd crush class ls", \ "list all crush device classes", \ "osd", "r", "cli,rest") +COMMAND("osd crush class ls-osd " \ + "name=class,type=CephString,goodchars=[A-Za-z0-9-_]", \ + "list all osds belonging to the specific ", \ + "osd", "r", "cli,rest") COMMAND("osd setmaxosd " \ "name=newmax,type=CephInt,range=0", \ "set new maximum osd value", "osd", "rw", "cli,rest") diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 31ba54670d81..8b8eb1901e10 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -4925,6 +4925,17 @@ bool OSDMonitor::preprocess_command(MonOpRequestRef op) f->dump_string("class", i.second); f->close_section(); f->flush(rdata); + } else if (prefix == "osd crush class ls-osd") { + string name; + cmd_getval(g_ceph_context, cmdmap, "class", name); + boost::scoped_ptr f(Formatter::create(format, "json-pretty", "json-pretty")); + set osds; + osdmap.crush->get_devices_by_class(name, &osds); + f->open_array_section("osds"); + for (auto& osd : osds) + f->dump_int("osd", osd); + f->close_section(); + f->flush(rdata); } else if (prefix == "osd erasure-code-profile ls") { const auto &profiles = osdmap.get_erasure_code_profiles(); if (f) diff --git a/src/test/crush/crush-classes.sh b/src/test/crush/crush-classes.sh index 5dd9553dd674..b26cc8691add 100755 --- a/src/test/crush/crush-classes.sh +++ b/src/test/crush/crush-classes.sh @@ -116,7 +116,9 @@ function TEST_set_device_class() { TEST_classes $dir || return 1 ceph osd crush set-device-class ssd osd.0 || return 1 + ceph osd crush class ls-osd ssd | grep 0 || return 1 ceph osd crush set-device-class ssd osd.1 || return 1 + ceph osd crush class ls-osd ssd | grep 1 || return 1 ceph osd crush set-device-class ssd 0 1 || return 1 # should be idempotent ok=false