ceph osd crush rule create-replicated foo-ssd default host ssd || return 1
expect_failure $dir EBUSY ceph osd crush class rm hdd || return 1
expect_failure $dir EBUSY ceph osd crush class rm ssd || return 1
- expect_failure $dir EBUSY ceph osd crush class rename hdd asdf || return 1
- expect_failure $dir EBUSY ceph osd crush class rename ssd qwer || return 1
ceph osd crush rule rm foo-hdd1 || return 1
expect_failure $dir EBUSY ceph osd crush class rm hdd || return 1 # still referenced by foo-hdd2
ceph osd crush rule rm foo-hdd2 || return 1
ceph osd crush rule rm foo-ssd || return 1
- ceph osd crush class rename hdd asdf || return 1
- ceph osd crush class rename ssd qwer || return 1
- ceph osd crush class rm asdf || return 1
- ceph osd crush class rm qwer || return 1
+ ceph osd crush class rm hdd || return 1
+ ceph osd crush class rm ssd || return 1
expect_failure $dir EBUSY ceph osd crush class rm abc || return 1 # still referenced by foo-rule
ceph osd crush rule rm foo-rule || return 1
ceph osd crush class rm abc || return 1
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;
- }
-
int32_t _alloc_class_id() const;
int get_or_create_class_id(const string& name) {
"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")
<< " 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 (osdmap.require_osd_release < CEPH_RELEASE_LUMINOUS) {
- ss << "you must complete the upgrade and 'ceph osd require-osd-release "
- << "luminous' before using crush device classes";
- err = -EPERM;
- 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);
-
- stringstream ts;
- if (newcrush.class_is_in_use(class_id, &ts)) {
- err = -EBUSY;
- ss << "class '" << srcname << "' " << ts.str();
- 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 (prefix == "osd crush weight-set create" ||
prefix == "osd crush weight-set create-compat") {
CrushWrapper newcrush;