]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: "osd crush ls-osd" support
authorxie xingguo <xie.xingguo@zte.com.cn>
Sat, 1 Jul 2017 07:56:50 +0000 (15:56 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Mon, 10 Jul 2017 00:45:36 +0000 (08:45 +0800)
Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/crush/CrushWrapper.h
src/mon/MonCommands.h
src/mon/OSDMonitor.cc
src/test/crush/crush-classes.sh

index b5bfebb765780f44c2b002ff5a246047f2e7d37c..56b26dbd075a42f23092815b8059c012dc6563b8 100644 (file)
@@ -510,7 +510,19 @@ public:
     class_map[i] = c;
     return c;
   }
-
+  void get_devices_by_class(const string &name, set<int> *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;
index bfdf0041ebafe2634452f930608f2c45ffc605d2..017e3ebb54b2656e8c1045fcdb60fb57d2c22be8 100644 (file)
@@ -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 <class>", \
+        "osd", "r", "cli,rest")
 COMMAND("osd setmaxosd " \
        "name=newmax,type=CephInt,range=0", \
        "set new maximum osd value", "osd", "rw", "cli,rest")
index 31ba54670d8118fa0731a4a410a4eed537dfd99c..8b8eb1901e101249b238218e85d08a239a692059 100644 (file)
@@ -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<Formatter> f(Formatter::create(format, "json-pretty", "json-pretty"));
+    set<int> 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)
index 5dd9553dd674531d601c1b8c198600b9a6797ab3..b26cc8691add6f0455e67447e435bbad20eda79b 100755 (executable)
@@ -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