]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
erasure-code: OSDMonitor::crush_ruleset_create_erasure needs ruleset
authorLoic Dachary <loic@dachary.org>
Sun, 10 Aug 2014 15:06:33 +0000 (17:06 +0200)
committerLoic Dachary <loic@dachary.org>
Tue, 12 Aug 2014 13:53:31 +0000 (15:53 +0200)
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 <loic@dachary.org>
(cherry picked from commit 04a484a4d5800c9bcf9805d3e87ed0c8dee01c9a)

src/erasure-code/ErasureCodeInterface.h
src/mon/OSDMonitor.cc

index f8e22d1eb531bd397db3a94eccdc2b551fae0608..1dc12c5a0e0a08d3a266965975809590eacb8714 100644 (file)
@@ -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,
index 03d6d8fa25c1eb72704ac6798f61ecdb1460fba5..3f433b52cbebd77793d41e0d4f2dea4c284e4194 100644 (file)
@@ -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;