break;
case pg_pool_t::TYPE_ERASURE:
{
- map<string,string>::const_iterator ruleset =
- properties.find("crush_ruleset");
- if (ruleset == properties.end()) {
- ss << "prepare_pool_crush_ruleset: crush_ruleset is missing from "
- << properties;
- return -EINVAL;
- }
-
- *crush_ruleset = osdmap.crush->get_rule_id(ruleset->second);
- if (*crush_ruleset < 0) {
- CrushWrapper newcrush;
- _get_pending_crush(newcrush);
-
- int rule = newcrush.get_rule_id(ruleset->second);
- if (rule < 0) {
- ss << "prepare_pool_crush_ruleset: ruleset " << ruleset->second
- << " does not exist";
- return -EINVAL;
- } else {
- dout(20) << "prepare_pool_crush_ruleset: ruleset "
- << ruleset->second << " try again" << dendl;
- return -EAGAIN;
- }
- }
+ string ruleset;
+ map<string,string>::const_iterator i = properties.find("crush_ruleset");
+ if (i == properties.end()) {
+ dout(1) << "prepare_pool_crush_ruleset: implicitly use ruleset "
+ << "named after the pool: " << poolstr << dendl;
+ ruleset = poolstr;
+ } else {
+ ruleset = i->second;
+ }
+
+ int err = crush_ruleset_create_erasure(ruleset, properties,
+ crush_ruleset, ss);
+ switch (err) {
+ case -EALREADY:
+ dout(20) << "prepare_pool_crush_ruleset: ruleset "
+ << ruleset << " try again" << dendl;
+ case 0:
+ // need to wait for the crush rule to be proposed before proceeding
+ err = -EAGAIN;
+ break;
+ case -EEXIST:
+ err = 0;
+ break;
+ }
+ return err;
}
break;
default: