From: xie xingguo Date: Fri, 23 Jun 2017 07:41:58 +0000 (+0800) Subject: mon/OSDMonitor: "osd crush class rename" support X-Git-Tag: v12.1.2~1^2~55^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d6ce05f88c07c46ddce163dbe3fce93e185c5d12;p=ceph.git mon/OSDMonitor: "osd crush class rename" support Signed-off-by: xie xingguo --- diff --git a/src/crush/CrushWrapper.h b/src/crush/CrushWrapper.h index fce35ce79e97..2a02fd0c501d 100644 --- a/src/crush/CrushWrapper.h +++ b/src/crush/CrushWrapper.h @@ -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) { diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 69a63964c835..0692ff8271dd 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -616,6 +616,11 @@ COMMAND("osd crush class rm " \ "name=class,type=CephString,goodchars=[A-Za-z0-9-_]", \ "remove crush device 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 to ", \ + "osd", "rw", "cli,rest") COMMAND("osd crush class ls", \ "list all crush device classes", \ "osd", "r", "cli,rest") diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index fd3fd8fed76f..ea45ddfb663a 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -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")) { diff --git a/src/test/crush/crush-classes.sh b/src/test/crush/crush-classes.sh index fe6bbcc2f207..76245779d59c 100755 --- a/src/test/crush/crush-classes.sh +++ b/src/test/crush/crush-classes.sh @@ -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 }