From: Loic Dachary Date: Sun, 10 Aug 2014 15:06:33 +0000 (+0200) Subject: erasure-code: OSDMonitor::crush_ruleset_create_erasure needs ruleset X-Git-Tag: v0.80.6~31^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=96047f1de4e0591a294e31ed6af6edfb3b2357e4;p=ceph.git erasure-code: OSDMonitor::crush_ruleset_create_erasure needs ruleset When OSDMonitor::crush_ruleset_create_erasure checks the ruleset for existence, it must convert the ruleid into a ruleset before assigning it back to the *ruleset parameter. http://tracker.ceph.com/issues/9044 Fixes: #9044 Signed-off-by: Loic Dachary (cherry picked from commit 04a484a4d5800c9bcf9805d3e87ed0c8dee01c9a) --- diff --git a/src/erasure-code/ErasureCodeInterface.h b/src/erasure-code/ErasureCodeInterface.h index f8e22d1eb531b..1dc12c5a0e0a0 100644 --- a/src/erasure-code/ErasureCodeInterface.h +++ b/src/erasure-code/ErasureCodeInterface.h @@ -167,7 +167,7 @@ namespace ceph { * @param [in] name of the ruleset to create * @param [in] crush crushmap in which the ruleset is created * @param [out] ss contains informative messages when an error occurs - * @return **0** on success or a negative errno on error. + * @return a ruleset on success or a negative errno on error. */ virtual int create_ruleset(const string &name, CrushWrapper &crush, diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 03d6d8fa25c1e..3f433b52cbebd 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -2925,15 +2925,18 @@ int OSDMonitor::crush_ruleset_create_erasure(const string &name, int *ruleset, stringstream &ss) { - *ruleset = osdmap.crush->get_rule_id(name); - if (*ruleset != -ENOENT) + int ruleid = osdmap.crush->get_rule_id(name); + if (ruleid != -ENOENT) { + *ruleset = osdmap.crush->get_rule_mask_ruleset(ruleid); return -EEXIST; + } CrushWrapper newcrush; _get_pending_crush(newcrush); - *ruleset = newcrush.get_rule_id(name); - if (*ruleset != -ENOENT) { + ruleid = newcrush.get_rule_id(name); + if (ruleid != -ENOENT) { + *ruleset = newcrush.get_rule_mask_ruleset(ruleid); return -EALREADY; } else { ErasureCodeInterfaceRef erasure_code;