]> 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>
Sun, 10 Aug 2014 15:18:30 +0000 (17:18 +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>
src/erasure-code/ErasureCodeInterface.h
src/mon/OSDMonitor.cc

index 328e323546e44453adcac59d282a9ca1aa94c03b..499cfc96ddc6c9e3d9b3a7640c562deb0292a3bd 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 c8e1e9bc0fd84665cf1dc33e7978156f1a902fbb..3b6de571be32eed8623dbc9fc8dfcf07dcb2d6b8 100644 (file)
@@ -3067,15 +3067,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;