]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: "osd crush class rename" support
authorxie xingguo <xie.xingguo@zte.com.cn>
Fri, 23 Jun 2017 07:41:58 +0000 (15:41 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Fri, 23 Jun 2017 10:37:35 +0000 (18:37 +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 fce35ce79e975846812cc6200c2b831f558bcf15..2a02fd0c501d1b1252f8b9af8afc86c3812f3cd1 100644 (file)
@@ -466,6 +466,22 @@ public:
     class_name.erase(class_id);
     return 0;
   }
+
+  int rename_class(const string& srcname, const string& dstname) {
+    auto p = class_rname.find(srcname);
+    if (p == class_rname.end())
+      return -ENOENT;
+    int class_id = p->second;
+    auto q = class_name.find(class_id);
+    if (q == class_name.end())
+      return -ENOENT;
+    class_rname.erase(srcname);
+    class_name.erase(class_id);
+    class_rname[dstname] = class_id;
+    class_name[class_id] = dstname;
+    return 0;
+  }
+
   int get_or_create_class_id(const string& name) {
     int c = get_class_id(name);
     if (c < 0) {
index 69a63964c8355e9bea6f72c0dc96fdb121d93ee6..0692ff8271dd617e15329d4bb3e383898f0e3a49 100644 (file)
@@ -616,6 +616,11 @@ COMMAND("osd crush class rm " \
        "name=class,type=CephString,goodchars=[A-Za-z0-9-_]", \
        "remove crush device class <class>", \
        "osd", "rw", "cli,rest")
+COMMAND("osd crush class rename " \
+        "name=srcname,type=CephString,goodchars=[A-Za-z0-9-_] " \
+        "name=dstname,type=CephString,goodchars=[A-Za-z0-9-_]", \
+        "rename crush device class <srcname> to <dstname>", \
+        "osd", "rw", "cli,rest")
 COMMAND("osd crush class ls", \
        "list all crush device classes", \
        "osd", "r", "cli,rest")
index fd3fd8fed76f48d74043285472a8f5d4e6941a6f..ea45ddfb663afb5347a20f32dfb0cad2b3bb03d5 100644 (file)
@@ -7216,6 +7216,53 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
     ss << "removed class " << device_class << " with id " << class_id
        << " from crush map";
     goto update;
+
+  } else if (prefix == "osd crush class rename") {
+    string srcname, dstname;
+    if (!cmd_getval(g_ceph_context, cmdmap, "srcname", srcname)) {
+      err = -EINVAL;
+      goto reply;
+    }
+
+    if (!cmd_getval(g_ceph_context, cmdmap, "dstname", dstname)) {
+      err = -EINVAL;
+      goto reply;
+    }
+
+    CrushWrapper newcrush;
+    _get_pending_crush(newcrush);
+
+    if (!newcrush.class_exists(srcname)) {
+      err = -ENOENT;
+      ss << "class '" << srcname << "' does not exist";
+      goto reply;
+    }
+
+    if (newcrush.class_exists(dstname)) {
+      err = -EEXIST;
+      ss << "class '" << dstname << "' already exists";
+      goto reply;
+    }
+
+    int class_id = newcrush.get_class_id(srcname);
+
+    if (newcrush.class_is_in_use(class_id)) {
+      err = -EBUSY;
+      ss << "class '" << srcname << "' is in use";
+      goto reply;
+    }
+
+    err = newcrush.rename_class(srcname, dstname);
+    if (err < 0) {
+      ss << "fail to rename '" << srcname << "' to '" << dstname << "':"
+         << cpp_strerror(err);
+      goto reply;
+    }
+
+    pending_inc.crush.clear();
+    newcrush.encode(pending_inc.crush, mon->get_quorum_con_features());
+    ss << "rename class '" << srcname << "' to '" << dstname << "'";
+    goto update;
     
   } else if (osdid_present &&
             (prefix == "osd crush set" || prefix == "osd crush add")) {
index fe6bbcc2f20787db0fa27b8edd8d0552be0ffcc9..76245779d59c98c6964e623389ad7ce35248540d 100755 (executable)
@@ -135,6 +135,10 @@ function TEST_mon_classes() {
     ceph osd crush class create CLASS || return 1
     ceph osd crush class create CLASS || return 1 # idempotent
     ceph osd crush class ls | grep CLASS  || return 1
+    ceph osd crush class rename CLASS TEMP || return 1
+    ceph osd crush class ls | grep TEMP || return 1
+    ceph osd crush class rename TEMP CLASS || return 1
+    ceph osd crush class ls | grep CLASS  || return 1
     ceph osd crush class rm CLASS || return 1
     expect_failure $dir ENOENT ceph osd crush class rm CLASS || return 1
 }