From a85f3206b533de311bfb891efab26c5f9c7824d6 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 30 Jun 2017 15:50:07 -0400 Subject: [PATCH] erasure-code: factor generic create_rule into parent ErasureCode These 3 implementations are all identical. Move the rest of init() to into the parent since these all behave the same. Signed-off-by: Sage Weil --- src/erasure-code/ErasureCode.cc | 43 +++++++++++++++++++ src/erasure-code/ErasureCode.h | 13 ++++-- src/erasure-code/isa/ErasureCodeIsa.cc | 33 +------------- src/erasure-code/isa/ErasureCodeIsa.h | 13 +----- .../jerasure/ErasureCodeJerasure.cc | 30 +------------ .../jerasure/ErasureCodeJerasure.h | 9 ---- src/erasure-code/shec/ErasureCodeShec.cc | 31 +------------ src/erasure-code/shec/ErasureCodeShec.h | 11 ----- 8 files changed, 57 insertions(+), 126 deletions(-) diff --git a/src/erasure-code/ErasureCode.cc b/src/erasure-code/ErasureCode.cc index 353ab4f0d8e..4c5021ee91f 100644 --- a/src/erasure-code/ErasureCode.cc +++ b/src/erasure-code/ErasureCode.cc @@ -22,11 +22,54 @@ #include "common/strtol.h" #include "include/buffer.h" +#include "crush/CrushWrapper.h" +#include "osd/osd_types.h" using namespace std; const unsigned ErasureCode::SIMD_ALIGN = 32; +#define DEFAULT_RULE_ROOT "default" +#define DEFAULT_RULE_FAILURE_DOMAIN "host" + +int ErasureCode::init( + ErasureCodeProfile &profile, + std::ostream *ss) +{ + int err = 0; + err |= to_string("crush-root", profile, + &rule_root, + DEFAULT_RULE_ROOT, ss); + err |= to_string("crush-failure-domain", profile, + &rule_failure_domain, + DEFAULT_RULE_FAILURE_DOMAIN, ss); + if (err) + return err; + _profile = profile; + return 0; +} + +int ErasureCode::create_rule( + const std::string &name, + CrushWrapper &crush, + std::ostream *ss) const +{ + int ruleid = crush.add_simple_rule( + name, + rule_root, + rule_failure_domain, + "", + "indep", + pg_pool_t::TYPE_ERASURE, + ss); + + if (ruleid < 0) + return ruleid; + + crush.set_rule_mask_max_size(ruleid, get_chunk_count()); + return ruleid; +} + int ErasureCode::sanity_check_k(int k, ostream *ss) { if (k < 2) { diff --git a/src/erasure-code/ErasureCode.h b/src/erasure-code/ErasureCode.h index e544b022a12..bce77e68b66 100644 --- a/src/erasure-code/ErasureCode.h +++ b/src/erasure-code/ErasureCode.h @@ -33,17 +33,22 @@ namespace ceph { std::vector chunk_mapping; ErasureCodeProfile _profile; + // for CRUSH rule + std::string rule_root; + std::string rule_failure_domain; + ~ErasureCode() override {} - int init(ErasureCodeProfile &profile, std::ostream *ss) override { - _profile = profile; - return 0; - } + int init(ErasureCodeProfile &profile, std::ostream *ss) override; const ErasureCodeProfile &get_profile() const override { return _profile; } + int create_rule(const std::string &name, + CrushWrapper &crush, + std::ostream *ss) const; + int sanity_check_k(int k, std::ostream *ss); unsigned int get_coding_chunk_count() const override { diff --git a/src/erasure-code/isa/ErasureCodeIsa.cc b/src/erasure-code/isa/ErasureCodeIsa.cc index 787acb6d7d3..46c8e830173 100644 --- a/src/erasure-code/isa/ErasureCodeIsa.cc +++ b/src/erasure-code/isa/ErasureCodeIsa.cc @@ -19,8 +19,7 @@ #include "common/debug.h" #include "ErasureCodeIsa.h" #include "xor_op.h" -#include "crush/CrushWrapper.h" -#include "osd/osd_types.h" +#include "include/assert.h" using namespace std; // ----------------------------------------------------------------------------- @@ -46,27 +45,6 @@ _prefix(std::ostream* _dout) const std::string ErasureCodeIsaDefault::DEFAULT_K("7"); const std::string ErasureCodeIsaDefault::DEFAULT_M("3"); -int -ErasureCodeIsa::create_rule(const string &name, - CrushWrapper &crush, - ostream *ss) const -{ - int ruleid = crush.add_simple_rule( - name, - rule_root, - rule_failure_domain, - "", - "indep", - pg_pool_t::TYPE_ERASURE, - ss); - - if (ruleid < 0) - return ruleid; - else { - crush.set_rule_mask_max_size(ruleid, get_chunk_count()); - return ruleid; - } -} // ----------------------------------------------------------------------------- @@ -74,18 +52,11 @@ int ErasureCodeIsa::init(ErasureCodeProfile &profile, ostream *ss) { int err = 0; - err |= to_string("crush-root", profile, - &rule_root, - DEFAULT_RULE_ROOT, ss); - err |= to_string("crush-failure-domain", profile, - &rule_failure_domain, - DEFAULT_RULE_FAILURE_DOMAIN, ss); err |= parse(profile, ss); if (err) return err; prepare(); - ErasureCode::init(profile, ss); - return err; + return ErasureCode::init(profile, ss); } // ----------------------------------------------------------------------------- diff --git a/src/erasure-code/isa/ErasureCodeIsa.h b/src/erasure-code/isa/ErasureCodeIsa.h index bdf1197f857..d67b918f79e 100644 --- a/src/erasure-code/isa/ErasureCodeIsa.h +++ b/src/erasure-code/isa/ErasureCodeIsa.h @@ -30,9 +30,6 @@ #include "ErasureCodeIsaTableCache.h" // ----------------------------------------------------------------------------- -#define DEFAULT_RULE_ROOT "default" -#define DEFAULT_RULE_FAILURE_DOMAIN "host" - class ErasureCodeIsa : public ErasureCode { public: @@ -46,8 +43,6 @@ public: ErasureCodeIsaTableCache &tcache; const char *technique; - std::string rule_root; - std::string rule_failure_domain; ErasureCodeIsa(const char *_technique, ErasureCodeIsaTableCache &_tcache) : @@ -55,9 +50,7 @@ public: m(0), w(0), tcache(_tcache), - technique(_technique), - rule_root(DEFAULT_RULE_ROOT), - rule_failure_domain(DEFAULT_RULE_FAILURE_DOMAIN) + technique(_technique) { } @@ -66,10 +59,6 @@ public: { } - int create_rule(const std::string &name, - CrushWrapper &crush, - std::ostream *ss) const override; - unsigned int get_chunk_count() const override { diff --git a/src/erasure-code/jerasure/ErasureCodeJerasure.cc b/src/erasure-code/jerasure/ErasureCodeJerasure.cc index 1db7d7e63b9..599073eb3f7 100644 --- a/src/erasure-code/jerasure/ErasureCodeJerasure.cc +++ b/src/erasure-code/jerasure/ErasureCodeJerasure.cc @@ -17,8 +17,6 @@ #include "common/debug.h" #include "ErasureCodeJerasure.h" -#include "crush/CrushWrapper.h" -#include "osd/osd_types.h" using namespace std; @@ -42,43 +40,17 @@ static ostream& _prefix(std::ostream* _dout) return *_dout << "ErasureCodeJerasure: "; } -int ErasureCodeJerasure::create_rule(const string &name, - CrushWrapper &crush, - ostream *ss) const -{ - int ruleid = crush.add_simple_rule( - name, - rule_root, - rule_failure_domain, - "", - "indep", - pg_pool_t::TYPE_ERASURE, - ss); - if (ruleid < 0) - return ruleid; - else { - crush.set_rule_mask_max_size(ruleid, get_chunk_count()); - return ruleid; - } -} int ErasureCodeJerasure::init(ErasureCodeProfile& profile, ostream *ss) { int err = 0; dout(10) << "technique=" << technique << dendl; profile["technique"] = technique; - err |= to_string("crush-root", profile, - &rule_root, - DEFAULT_RULE_ROOT, ss); - err |= to_string("crush-failure-domain", profile, - &rule_failure_domain, - DEFAULT_RULE_FAILURE_DOMAIN, ss); err |= parse(profile, ss); if (err) return err; prepare(); - ErasureCode::init(profile, ss); - return err; + return ErasureCode::init(profile, ss); } int ErasureCodeJerasure::parse(ErasureCodeProfile &profile, diff --git a/src/erasure-code/jerasure/ErasureCodeJerasure.h b/src/erasure-code/jerasure/ErasureCodeJerasure.h index a0e7d7ab486..be9abc5615f 100644 --- a/src/erasure-code/jerasure/ErasureCodeJerasure.h +++ b/src/erasure-code/jerasure/ErasureCodeJerasure.h @@ -20,9 +20,6 @@ #include "erasure-code/ErasureCode.h" -#define DEFAULT_RULE_ROOT "default" -#define DEFAULT_RULE_FAILURE_DOMAIN "host" - class ErasureCodeJerasure : public ErasureCode { public: int k; @@ -44,17 +41,11 @@ public: w(0), DEFAULT_W("8"), technique(_technique), - rule_root(DEFAULT_RULE_ROOT), - rule_failure_domain(DEFAULT_RULE_FAILURE_DOMAIN), per_chunk_alignment(false) {} ~ErasureCodeJerasure() override {} - int create_rule(const std::string &name, - CrushWrapper &crush, - std::ostream *ss) const override; - unsigned int get_chunk_count() const override { return k + m; } diff --git a/src/erasure-code/shec/ErasureCodeShec.cc b/src/erasure-code/shec/ErasureCodeShec.cc index f47127e0db9..17b380d5e43 100644 --- a/src/erasure-code/shec/ErasureCodeShec.cc +++ b/src/erasure-code/shec/ErasureCodeShec.cc @@ -27,8 +27,6 @@ using namespace std; #include "common/debug.h" #include "ErasureCodeShec.h" -#include "crush/CrushWrapper.h" -#include "osd/osd_types.h" extern "C" { #include "jerasure/include/jerasure.h" #include "jerasure/include/galois.h" @@ -47,42 +45,15 @@ static ostream& _prefix(std::ostream* _dout) return *_dout << "ErasureCodeShec: "; } -int ErasureCodeShec::create_rule(const string &name, - CrushWrapper &crush, - ostream *ss) const -{ - int ruleid = crush.add_simple_rule( - name, - rule_root, - rule_failure_domain, - "", - "indep", - pg_pool_t::TYPE_ERASURE, - ss); - if (ruleid < 0) { - return ruleid; - } else { - crush.set_rule_mask_max_size(ruleid, get_chunk_count()); - return ruleid; - } -} - int ErasureCodeShec::init(ErasureCodeProfile &profile, ostream *ss) { int err = 0; - err |= ErasureCode::to_string("crush-root", profile, - &rule_root, - DEFAULT_RULE_ROOT, ss); - err |= ErasureCode::to_string("crush-failure-domain", profile, - &rule_failure_domain, - DEFAULT_RULE_FAILURE_DOMAIN, ss); err |= parse(profile); if (err) return err; prepare(); - ErasureCode::init(profile, ss); - return err; + return ErasureCode::init(profile, ss); } unsigned int ErasureCodeShec::get_chunk_size(unsigned int object_size) const diff --git a/src/erasure-code/shec/ErasureCodeShec.h b/src/erasure-code/shec/ErasureCodeShec.h index fc580706e65..073644e7ad0 100644 --- a/src/erasure-code/shec/ErasureCodeShec.h +++ b/src/erasure-code/shec/ErasureCodeShec.h @@ -24,9 +24,6 @@ #include "erasure-code/ErasureCode.h" #include "ErasureCodeShecTableCache.h" -#define DEFAULT_RULE_ROOT "default" -#define DEFAULT_RULE_FAILURE_DOMAIN "host" - class ErasureCodeShec : public ErasureCode { public: @@ -45,8 +42,6 @@ public: int w; int DEFAULT_W; int technique; - string rule_root; - string rule_failure_domain; int *matrix; ErasureCodeShec(const int _technique, @@ -61,17 +56,11 @@ public: w(0), DEFAULT_W(8), technique(_technique), - rule_root(DEFAULT_RULE_ROOT), - rule_failure_domain(DEFAULT_RULE_FAILURE_DOMAIN), matrix(0) {} ~ErasureCodeShec() override {} - int create_rule(const string &name, - CrushWrapper &crush, - ostream *ss) const override; - unsigned int get_chunk_count() const override { return k + m; } -- 2.39.5