]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
erasure-code: ErasureCodeJerasure::create_ruleset must return a ruleset
authorLoic Dachary <loic@dachary.org>
Sun, 10 Aug 2014 15:10:04 +0000 (17:10 +0200)
committerLoic Dachary <loic@dachary.org>
Sun, 10 Aug 2014 15:18:30 +0000 (17:18 +0200)
CrushWrapper::add_simple_ruleset does not return a ruleset, it returns
a ruleid that must be converted into a ruleset before being returned.

http://tracker.ceph.com/issues/9044 Fixes: #9044

Signed-off-by: Loic Dachary <loic@dachary.org>
src/erasure-code/jerasure/ErasureCodeJerasure.cc
src/test/erasure-code/TestErasureCodeJerasure.cc

index e243f4bc4427d918ca0a55f4d5bd1eab8aced30f..834a2d5d88457b60cd1c9f85dd74b56e8145d03e 100644 (file)
@@ -41,8 +41,12 @@ int ErasureCodeJerasure::create_ruleset(const string &name,
                                        CrushWrapper &crush,
                                        ostream *ss) const
 {
-  return crush.add_simple_ruleset(name, ruleset_root, ruleset_failure_domain,
-                                 "indep", pg_pool_t::TYPE_ERASURE, ss);
+  int ruleid = crush.add_simple_ruleset(name, ruleset_root, ruleset_failure_domain,
+                                       "indep", pg_pool_t::TYPE_ERASURE, ss);
+  if (ruleid < 0)
+    return ruleid;
+  else
+    return crush.get_rule_mask_ruleset(ruleid);
 }
 
 void ErasureCodeJerasure::init(const map<string,string> &parameters)
index b7f35ac6496d4bc6b9a2e93e775b6e55870786d5..2cf81a8ef9a4a11aed8c917341e5e2c3b67704a6 100644 (file)
@@ -293,6 +293,36 @@ TEST(ErasureCodeTest, create_ruleset)
     }
   }
 
+  //
+  // The ruleid may be different from the ruleset when a crush rule is
+  // removed because the removed ruleid will be reused but the removed
+  // ruleset will not be reused. 
+  //
+  // This also asserts that the create_ruleset() method returns a
+  // ruleset and not a ruleid http://tracker.ceph.com/issues/9044
+  //
+  {
+    stringstream ss;
+    ErasureCodeJerasureReedSolomonVandermonde jerasure;
+    map<std::string,std::string> parameters;
+    parameters["k"] = "2";
+    parameters["m"] = "2";
+    parameters["w"] = "8";
+    jerasure.init(parameters);
+    int FIRST = jerasure.create_ruleset("FIRST", *c, &ss);
+    int SECOND = jerasure.create_ruleset("SECOND", *c, &ss);
+    int FIRST_ruleid = c->get_rule_id("FIRST");
+    EXPECT_EQ(0, c->remove_rule(FIRST_ruleid));
+    int ruleset = jerasure.create_ruleset("myrule", *c, &ss);
+    EXPECT_NE(FIRST, ruleset);
+    EXPECT_NE(SECOND, ruleset);
+    EXPECT_NE(ruleset, c->get_rule_id("myrule"));
+    int SECOND_ruleid = c->get_rule_id("SECOND");
+    EXPECT_EQ(0, c->remove_rule(SECOND_ruleid));
+    int myrule_ruleid = c->get_rule_id("myrule");
+    EXPECT_EQ(0, c->remove_rule(myrule_ruleid));
+  }
+
   {
     stringstream ss;
     ErasureCodeJerasureReedSolomonVandermonde jerasure;