"name=type,type=CephString", \
"add no-parent (probably root) crush bucket <name> of type <type>", \
"osd", "rw", "cli,rest")
+COMMAND("osd crush rename-bucket " \
+ "name=srcname,type=CephString,goodchars=[A-Za-z0-9-_.] " \
+ "name=dstname,type=CephString,goodchars=[A-Za-z0-9-_.]", \
+ "rename bucket <srcname> to <dstname>", \
+ "osd", "rw", "cli,rest")
COMMAND("osd crush set " \
"name=id,type=CephOsdName " \
"name=weight,type=CephFloat,range=0.0 " \
pg_pool_t::TYPE_REPLICATED, 0, ss);
}
+int OSDMonitor::crush_rename_bucket(const string& srcname,
+ const string& dstname,
+ ostream *ss)
+{
+ int ret;
+ //
+ // Avoid creating a pending crush if it does not already exists and
+ // the rename would fail.
+ //
+ if (!_have_pending_crush()) {
+ ret = _get_stable_crush().can_rename_bucket(srcname,
+ dstname,
+ ss);
+ if (ret)
+ return ret;
+ }
+
+ CrushWrapper newcrush;
+ _get_pending_crush(newcrush);
+
+ ret = newcrush.rename_bucket(srcname,
+ dstname,
+ ss);
+ if (ret)
+ return ret;
+
+ pending_inc.crush.clear();
+ newcrush.encode(pending_inc.crush);
+ *ss << "renamed bucket " << srcname << " into " << dstname;
+ return 0;
+}
+
int OSDMonitor::crush_ruleset_create_erasure(const string &name,
const string &profile,
int *ruleset,
ss << "added bucket " << name << " type " << typestr
<< " to crush map";
goto update;
+ } else if (prefix == "osd crush rename-bucket") {
+ string srcname, dstname;
+ cmd_getval(g_ceph_context, cmdmap, "srcname", srcname);
+ cmd_getval(g_ceph_context, cmdmap, "dstname", dstname);
+
+ err = crush_rename_bucket(srcname, dstname, &ss);
+ if (err == -EALREADY) // equivalent to success for idempotency
+ err = 0;
+ if (err)
+ goto reply;
+ else
+ goto update;
} else if (osdid_present &&
(prefix == "osd crush set" || prefix == "osd crush add")) {
// <OsdName> is 'osd.<id>' or '<id>', passed as int64_t id
bool prepare_pool_op (MPoolOp *m);
bool prepare_pool_op_create (MPoolOp *m);
bool prepare_pool_op_delete(MPoolOp *m);
+ int crush_rename_bucket(const string& srcname,
+ const string& dstname,
+ ostream *ss);
int crush_ruleset_create_erasure(const string &name,
const string &profile,
int *ruleset,