From 12430fed85b2cfeaeb33a443e6a4c6538d0833f8 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 15 Aug 2014 08:52:37 -0700 Subject: [PATCH] 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) --- src/crush/CrushWrapper.cc | 56 +++++++++++++++++++++++++++------------ src/crush/CrushWrapper.h | 2 ++ 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/crush/CrushWrapper.cc b/src/crush/CrushWrapper.cc index 15a46c25881d8..31da4f5217b24 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 cc4d77e84a262..d5d4f4f875671 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 { -- 2.39.5