"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 create-erasure " \
+ "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] " \
+ "name=properties,type=CephString,n=N,req=false,goodchars=[A-Za-z0-9-_.=]", \
+ "create crush rule <name> suitable for erasure coded pool created with <properties>", \
+ "osd", "rw", "cli,rest")
COMMAND("osd crush rule rm " \
"name=name,type=CephString,goodchars=[A-Za-z0-9-_.] ", \
"remove crush rule <name>", "osd", "rw", "cli,rest")
#include "common/config.h"
#include "common/errno.h"
+#include "osd/ErasureCodePlugin.h"
+
#include "include/compat.h"
#include "include/assert.h"
#include "include/stringify.h"
get_last_committed() + 1));
return true;
+ } else if (prefix == "osd crush rule create-erasure") {
+ string name, poolstr;
+ cmd_getval(g_ceph_context, cmdmap, "name", name);
+ vector<string> properties;
+ cmd_getval(g_ceph_context, cmdmap, "properties", properties);
+
+ if (osdmap.crush->rule_exists(name)) {
+ ss << "rule " << name << " already exists";
+ err = 0;
+ goto reply;
+ }
+
+ map<string,string> properties_map;
+ err = prepare_pool_properties(pg_pool_t::TYPE_ERASURE,
+ properties, &properties_map, ss);
+ if (err)
+ goto reply;
+
+ CrushWrapper newcrush;
+ _get_pending_crush(newcrush);
+
+ if (newcrush.rule_exists(name)) {
+ ss << "rule " << name << " already exists";
+ err = 0;
+ goto reply;
+ } else {
+ ErasureCodeInterfaceRef erasure_code;
+ err = get_erasure_code(properties_map, &erasure_code, ss);
+ if (err) {
+ ss << "failed to load plugin using properties " << properties_map;
+ goto reply;
+ }
+
+ int rule = erasure_code->create_ruleset(name, newcrush, &ss);
+ erasure_code.reset();
+ if (rule < 0) {
+ err = rule;
+ goto reply;
+ }
+ ss << "created rule " << name << " at " << rule;
+ pending_inc.crush.clear();
+ newcrush.encode(pending_inc.crush);
+ }
+
+ 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 rule rm") {
string name;
cmd_getval(g_ceph_context, cmdmap, "name", name);