]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
erasure-code: ErasureCodeJerasure::create_ruleset must return a ruleset 2244/head
authorLoic Dachary <loic@dachary.org>
Sun, 10 Aug 2014 15:10:04 +0000 (17:10 +0200)
committerLoic Dachary <loic@dachary.org>
Tue, 12 Aug 2014 13:53:53 +0000 (15:53 +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>
(cherry picked from commit 0029a35872d3fc15f9a0d60d095b2e111d6e98a6)

src/erasure-code/jerasure/ErasureCodeJerasure.cc
src/test/erasure-code/TestErasureCodeJerasure.cc

index 6d0f65306b7d1a7eb0726004ae57b1b424514e1e..06ccc58f480917d95c6871db13ffea8364c51cdd 100644 (file)
@@ -44,8 +44,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 4b768a80ae2eb7dc6f90046f14c985c89e37d9eb..5c637dae831be4fe97a1a8bd0affeaf4829d23f5 100644 (file)
@@ -288,6 +288,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;