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) {
"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")
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")) {
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
}