From 07e1ceb55ac3cf0bea58cec27737e45391de9106 Mon Sep 17 00:00:00 2001 From: Loic Dachary Date: Sun, 10 Aug 2014 17:10:04 +0200 Subject: [PATCH] erasure-code: ErasureCodeJerasure::create_ruleset must return a ruleset 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 (cherry picked from commit 0029a35872d3fc15f9a0d60d095b2e111d6e98a6) --- .../jerasure/ErasureCodeJerasure.cc | 8 +++-- .../erasure-code/TestErasureCodeJerasure.cc | 30 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/erasure-code/jerasure/ErasureCodeJerasure.cc b/src/erasure-code/jerasure/ErasureCodeJerasure.cc index 6d0f65306b7..06ccc58f480 100644 --- a/src/erasure-code/jerasure/ErasureCodeJerasure.cc +++ b/src/erasure-code/jerasure/ErasureCodeJerasure.cc @@ -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 ¶meters) diff --git a/src/test/erasure-code/TestErasureCodeJerasure.cc b/src/test/erasure-code/TestErasureCodeJerasure.cc index 4b768a80ae2..5c637dae831 100644 --- a/src/test/erasure-code/TestErasureCodeJerasure.cc +++ b/src/test/erasure-code/TestErasureCodeJerasure.cc @@ -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 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; -- 2.47.3