From: Loic Dachary Date: Sun, 26 Jan 2014 17:52:50 +0000 (+0100) Subject: mon: osd crush rule create-erasure X-Git-Tag: v0.78~226^2~13 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cb39b1367676215fc244664d83ffb3e245dbc5b0;p=ceph.git mon: osd crush rule create-erasure Delegates the creation of the rule to the erasure code plugin associated with the specified pool. Reviewed-By: Christophe Courtaut Signed-off-by: Loic Dachary --- diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index bff1f2e7b5ae..39191d1d55e5 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -434,6 +434,11 @@ COMMAND("osd crush rule create-simple " \ "name=mode,type=CephChoices,strings=firstn|indep,req=false", "create crush rule to start from , replicate across buckets of type , using a choose mode of (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 suitable for erasure coded pool created with ", \ + "osd", "rw", "cli,rest") COMMAND("osd crush rule rm " \ "name=name,type=CephString,goodchars=[A-Za-z0-9-_.] ", \ "remove crush rule ", "osd", "rw", "cli,rest") diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 597f9f6cecc2..b481a5809c66 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -44,6 +44,8 @@ #include "common/config.h" #include "common/errno.h" +#include "osd/ErasureCodePlugin.h" + #include "include/compat.h" #include "include/assert.h" #include "include/stringify.h" @@ -3639,6 +3641,55 @@ bool OSDMonitor::prepare_command(MMonCommand *m) 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 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 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);