ceph osd crush rm osd.$o3
ceph osd rm osd.$o3
+# test reweight-subtree
+o4=`ceph osd create`
+o5=`ceph osd create`
+ceph osd crush add $o4 123 root=default host=foobaz
+ceph osd crush add $o5 123 root=default host=foobaz
+ceph osd tree | grep osd.$o4 | grep 123
+ceph osd tree | grep osd.$o5 | grep 123
+ceph osd crush reweight-subtree foobaz 155
+ceph osd tree | grep osd.$o4 | grep 155
+ceph osd tree | grep osd.$o5 | grep 155
+ceph osd crush rm osd.$o4
+ceph osd crush rm osd.$o5
+ceph osd rm osd.$o4
+ceph osd rm osd.$o5
+
echo OK
"name=weight,type=CephFloat,range=0.0", \
"change <name>'s weight to <weight> in crush map", \
"osd", "rw", "cli,rest")
+COMMAND("osd crush reweight-subtree " \
+ "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] " \
+ "name=weight,type=CephFloat,range=0.0", \
+ "change all leaf items beneath <name> to <weight> in crush map", \
+ "osd", "rw", "cli,rest")
COMMAND("osd crush tunables " \
"name=profile,type=CephChoices,strings=legacy|argonaut|bobtail|firefly|optimal|default", \
"set crush tunables values to <profile>", "osd", "rw", "cli,rest")
}
} while (false);
+ } else if (prefix == "osd crush reweight-subtree") {
+ // osd crush reweight <name> <weight>
+ CrushWrapper newcrush;
+ _get_pending_crush(newcrush);
+
+ string name;
+ cmd_getval(g_ceph_context, cmdmap, "name", name);
+ if (!newcrush.name_exists(name)) {
+ err = -ENOENT;
+ ss << "device '" << name << "' does not appear in the crush map";
+ goto reply;
+ }
+
+ int id = newcrush.get_item_id(name);
+ if (id >= 0) {
+ ss << "device '" << name << "' is not a subtree in the crush map";
+ err = -EINVAL;
+ goto reply;
+ }
+ double w;
+ if (!cmd_getval(g_ceph_context, cmdmap, "weight", w)) {
+ ss << "unable to parse weight value '"
+ << cmd_vartype_stringify(cmdmap["weight"]) << "'";
+ err = -EINVAL;
+ goto reply;
+ }
+
+ err = newcrush.adjust_subtree_weightf(g_ceph_context, id, w);
+ if (err < 0)
+ goto reply;
+ pending_inc.crush.clear();
+ newcrush.encode(pending_inc.crush);
+ ss << "reweighted subtree id " << id << " name '" << name << "' to " << w
+ << " in crush map";
+ getline(ss, rs);
+ wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs,
+ get_last_committed() + 1));
+ return true;
} else if (prefix == "osd crush tunables") {
CrushWrapper newcrush;
_get_pending_crush(newcrush);