Create the ruleset and branch depending on the result:
* If it succeeds, wait
* If it already exists and is pending (-EALREADY), wait
* If it already exists (-EEXIST), return immediately
* If it fails for other reasons, return immediately
Add an informative message when it succeeds.
Signed-off-by: Loic Dachary <loic@dachary.org>
if (err)
goto reply;
+ int ruleset;
+ err = crush_ruleset_create_erasure(name, properties_map, &ruleset, ss);
+ if (err < 0) {
+ switch(err) {
+ case -EEXIST: // return immediately
+ ss << "rule " << name << " already exists";
+ err = 0;
+ goto reply;
+ break;
+ case -EALREADY: // wait for pending to be proposed
+ ss << "rule " << name << " already exists";
+ err = 0;
+ break;
+ default: // non recoverable error
+ goto reply;
+ break;
+ }
+ } else {
+ ss << "created ruleset " << name << " at " << ruleset;
+ }
+
getline(ss, rs);
wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs,
get_last_committed() + 1));