From: Sage Weil Date: Fri, 15 Aug 2014 15:52:37 +0000 (-0700) Subject: crush: add is_v[23]_rule(ruleid) methods X-Git-Tag: v0.80.6~72 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=12430fed85b2cfeaeb33a443e6a4c6538d0833f8;p=ceph.git crush: add is_v[23]_rule(ruleid) methods Add methods to check if a *specific* rule uses v2 or v3 features. Refactor the existing checks to use these. Signed-off-by: Sage Weil (cherry picked from commit 1d95486780a54c85a5c88936a4da4bdc3576a7b8) --- diff --git a/src/crush/CrushWrapper.cc b/src/crush/CrushWrapper.cc index 15a46c25881d..31da4f5217b2 100644 --- a/src/crush/CrushWrapper.cc +++ b/src/crush/CrushWrapper.cc @@ -10,17 +10,28 @@ bool CrushWrapper::has_v2_rules() const { - // check rules for use of indep or new SET_* rule steps for (unsigned i=0; imax_rules; i++) { - crush_rule *r = crush->rules[i]; - if (!r) - continue; - for (unsigned j=0; jlen; j++) { - if (r->steps[j].op == CRUSH_RULE_CHOOSE_INDEP || - r->steps[j].op == CRUSH_RULE_CHOOSELEAF_INDEP || - r->steps[j].op == CRUSH_RULE_SET_CHOOSE_TRIES || - r->steps[j].op == CRUSH_RULE_SET_CHOOSELEAF_TRIES) - return true; + if (is_v2_rule(i)) { + return true; + } + } + return false; +} + +bool CrushWrapper::is_v2_rule(unsigned ruleid) const +{ + // check rule for use of indep or new SET_* rule steps + if (ruleid >= crush->max_rules) + return false; + crush_rule *r = crush->rules[ruleid]; + if (!r) + return false; + for (unsigned j=0; jlen; j++) { + if (r->steps[j].op == CRUSH_RULE_CHOOSE_INDEP || + r->steps[j].op == CRUSH_RULE_CHOOSELEAF_INDEP || + r->steps[j].op == CRUSH_RULE_SET_CHOOSE_TRIES || + r->steps[j].op == CRUSH_RULE_SET_CHOOSELEAF_TRIES) { + return true; } } return false; @@ -28,14 +39,25 @@ bool CrushWrapper::has_v2_rules() const bool CrushWrapper::has_v3_rules() const { - // check rules for use of SET_CHOOSELEAF_VARY_R step for (unsigned i=0; imax_rules; i++) { - crush_rule *r = crush->rules[i]; - if (!r) - continue; - for (unsigned j=0; jlen; j++) { - if (r->steps[j].op == CRUSH_RULE_SET_CHOOSELEAF_VARY_R) - return true; + if (is_v3_rule(i)) { + return true; + } + } + return false; +} + +bool CrushWrapper::is_v3_rule(unsigned ruleid) const +{ + // check rule for use of SET_CHOOSELEAF_VARY_R step + if (ruleid >= crush->max_rules) + return false; + crush_rule *r = crush->rules[ruleid]; + if (!r) + return false; + for (unsigned j=0; jlen; j++) { + if (r->steps[j].op == CRUSH_RULE_SET_CHOOSELEAF_VARY_R) { + return true; } } return false; diff --git a/src/crush/CrushWrapper.h b/src/crush/CrushWrapper.h index cc4d77e84a26..d5d4f4f87567 100644 --- a/src/crush/CrushWrapper.h +++ b/src/crush/CrushWrapper.h @@ -216,6 +216,8 @@ public: bool has_v2_rules() const; bool has_v3_rules() const; + bool is_v2_rule(unsigned ruleid) const; + bool is_v3_rule(unsigned ruleid) const; // bucket types int get_num_type_names() const {