}
}
-int CrushWrapper::add_simple_rule(string name, string root_name, string failure_domain_name,
+int CrushWrapper::add_simple_rule(string name, string root_name,
+ string failure_domain_name,
+ string mode,
ostream *err)
{
if (rule_exists(name)) {
return -EINVAL;
}
}
+ if (mode != "firstn" && mode != "indep") {
+ if (err)
+ *err << "unknown mode " << mode;
+ return -EINVAL;
+ }
int ruleset = 0;
for (int i = 0; i < get_max_rules(); i++) {
crush_rule_set_step(rule, 0, CRUSH_RULE_TAKE, root, 0);
if (type)
crush_rule_set_step(rule, 1,
- CRUSH_RULE_CHOOSE_LEAF_FIRSTN,
+ mode == "firstn" ? CRUSH_RULE_CHOOSE_LEAF_FIRSTN :
+ CRUSH_RULE_CHOOSE_LEAF_INDEP,
CRUSH_CHOOSE_N,
type);
else
crush_rule_set_step(rule, 1,
- CRUSH_RULE_CHOOSE_FIRSTN,
+ mode == "firstn" ? CRUSH_RULE_CHOOSE_FIRSTN :
+ CRUSH_RULE_CHOOSE_INDEP,
CRUSH_CHOOSE_N,
0);
crush_rule_set_step(rule, 2, CRUSH_RULE_EMIT, 0, 0);
}
int add_simple_rule(string name, string root_name, string failure_domain_type,
- ostream *err = 0);
+ string mode, ostream *err = 0);
int remove_rule(int ruleno);
COMMAND("osd crush rule create-simple " \
"name=name,type=CephString,goodchars=[A-Za-z0-9-_.] " \
"name=root,type=CephString,goodchars=[A-Za-z0-9-_.] " \
- "name=type,type=CephString,goodchars=[A-Za-z0-9-_.]",
- "create crush rule <name> to 'take' from bucket <root> and 'chooseleaf_first' a bucket <type>", \
+ "name=type,type=CephString,goodchars=[A-Za-z0-9-_.] " \
+ "name=mode,type=CephChoices,strings=firstn|indep,req=false",
+ "create crush rule <name> to start from <root>, replicate across buckets of type <type>, using a choose mode of <firstn|indep> (default firstn; indep best for erasure pools)", \
"osd", "rw", "cli,rest")
COMMAND("osd crush rule rm " \
"name=name,type=CephString,goodchars=[A-Za-z0-9-_.] ", \
return true;
} else if (prefix == "osd crush rule create-simple") {
- string name, root, type;
+ string name, root, type, mode;
cmd_getval(g_ceph_context, cmdmap, "name", name);
cmd_getval(g_ceph_context, cmdmap, "root", root);
cmd_getval(g_ceph_context, cmdmap, "type", type);
+ cmd_getval(g_ceph_context, cmdmap, "mode", mode);
+ if (mode == "")
+ mode = "firstn";
if (osdmap.crush->rule_exists(name)) {
ss << "rule " << name << " already exists";
ss << "rule " << name << " already exists";
err = 0;
} else {
- int rule = newcrush.add_simple_rule(name, root, type, &ss);
+ int rule = newcrush.add_simple_rule(name, root, type, mode, &ss);
if (rule < 0) {
err = rule;
goto reply;