COMMAND("osd crush tree",
"dump crush buckets and items in a tree view",
"osd", "r", "cli,rest")
+COMMAND("osd crush class create " \
+ "name=class,type=CephString,goodchars=[A-Za-z0-9-_]", \
+ "create crush device class <class>", \
+ "osd", "rw", "cli,rest")
+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 ls", \
+ "list all crush device classes", \
+ "osd", "r", "cli,rest")
COMMAND("osd setmaxosd " \
"name=newmax,type=CephInt,range=0", \
"set new maximum osd value", "osd", "rw", "cli,rest")
osdmap.crush->dump_tree(f.get());
f->close_section();
f->flush(rdata);
+ } else if (prefix == "osd crush class ls") {
+ boost::scoped_ptr<Formatter> f(Formatter::create(format, "json-pretty", "json-pretty"));
+ f->open_array_section("crush_classes");
+ for (auto i : osdmap.crush->class_name)
+ f->dump_string("class", i.second);
+ f->close_section();
+ f->flush(rdata);
} else if (prefix == "osd erasure-code-profile ls") {
const map<string,map<string,string> > &profiles =
osdmap.get_erasure_code_profiles();
goto reply;
else
goto update;
+ } else if (prefix == "osd crush class create") {
+ string device_class;
+ if (!cmd_getval(g_ceph_context, cmdmap, "class", device_class)) {
+ err = -EINVAL; // no value!
+ goto reply;
+ }
+
+ if (!_have_pending_crush() &&
+ _get_stable_crush().class_exists(device_class)) {
+ ss << "class '" << device_class << "' already exists";
+ goto reply;
+ }
+
+ CrushWrapper newcrush;
+ _get_pending_crush(newcrush);
+
+ if (newcrush.class_exists(name)) {
+ ss << "class '" << device_class << "' already exists";
+ goto update;
+ }
+
+ int class_id = newcrush.get_or_create_class_id(device_class);
+
+ pending_inc.crush.clear();
+ newcrush.encode(pending_inc.crush, mon->get_quorum_con_features());
+ ss << "created class " << device_class << " with id " << class_id
+ << " to crush map";
+ goto update;
+
+ } else if (prefix == "osd crush class rm") {
+ string device_class;
+ if (!cmd_getval(g_ceph_context, cmdmap, "class", device_class)) {
+ err = -EINVAL; // no value!
+ goto reply;
+ }
+
+ CrushWrapper newcrush;
+ _get_pending_crush(newcrush);
+
+ if (!newcrush.class_exists(device_class)) {
+ err = -ENOENT;
+ ss << "class '" << device_class << "' does not exist";
+ goto reply;
+ }
+
+ int class_id = newcrush.get_class_id(device_class);
+
+ if (newcrush.class_is_in_use(class_id)) {
+ err = -EBUSY;
+ ss << "class '" << device_class << "' is in use";
+ goto reply;
+ }
+
+ err = newcrush.remove_class_name(device_class);
+ if (err < 0) {
+ ss << "class '" << device_class << "' cannot be removed '"
+ << cpp_strerror(err) << "'";
+ goto reply;
+ }
+
+ pending_inc.crush.clear();
+ newcrush.encode(pending_inc.crush, mon->get_quorum_con_features());
+ ss << "removed class " << device_class << " with id " << class_id
+ << " from crush map";
+ 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