From 196205dcf52f5fad3d7f6fd051958e9497c9b94d Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 16 Nov 2023 20:09:45 -0800 Subject: [PATCH] crush: add msr rule types and CrushWrapper infrastructure Signed-off-by: Samuel Just --- src/crush/CrushCompiler.cc | 10 ++++++++++ src/crush/CrushWrapper.cc | 24 ++++++++++++++++++++++++ src/crush/CrushWrapper.h | 6 +++++- src/crush/grammar.h | 2 +- src/include/ceph_features.h | 6 ++++-- src/osd/OSDMap.cc | 5 +++++ 6 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/crush/CrushCompiler.cc b/src/crush/CrushCompiler.cc index f7df0c6670ce8..740f003005b9a 100644 --- a/src/crush/CrushCompiler.cc +++ b/src/crush/CrushCompiler.cc @@ -369,6 +369,12 @@ int CrushCompiler::decompile(ostream &out) case CRUSH_RULE_TYPE_ERASURE: out << "\ttype erasure\n"; break; + case CRUSH_RULE_TYPE_MSR_FIRSTN: + out << "\ttype msr_firstn\n"; + break; + case CRUSH_RULE_TYPE_MSR_INDEP: + out << "\ttype msr_indep\n"; + break; default: out << "\ttype " << crush.get_rule_type(i) << "\n"; } @@ -784,6 +790,10 @@ int CrushCompiler::parse_rule(iter_t const& i) type = CRUSH_RULE_TYPE_REPLICATED; else if (tname == "erasure") type = CRUSH_RULE_TYPE_ERASURE; + else if (tname == "msr_firstn") + type = CRUSH_RULE_TYPE_MSR_FIRSTN; + else if (tname == "msr_indep") + type = CRUSH_RULE_TYPE_MSR_INDEP; else ceph_abort(); diff --git a/src/crush/CrushWrapper.cc b/src/crush/CrushWrapper.cc index 0f40e6875e1be..5e3694c5193b4 100644 --- a/src/crush/CrushWrapper.cc +++ b/src/crush/CrushWrapper.cc @@ -135,6 +135,29 @@ bool CrushWrapper::is_v5_rule(unsigned ruleid) const return false; } +bool CrushWrapper::has_msr_rules() const +{ + for (unsigned i=0; imax_rules; i++) { + if (is_msr_rule(i)) { + return true; + } + } + return false; +} + +bool CrushWrapper::is_msr_rule(unsigned ruleid) const +{ + if (ruleid >= crush->max_rules) + return false; + + crush_rule *r = crush->rules[ruleid]; + if (!r) + return false; + + return r->type == CRUSH_RULE_TYPE_MSR_INDEP || + r->type == CRUSH_RULE_TYPE_MSR_FIRSTN; +} + bool CrushWrapper::has_choose_args() const { return !choose_args.empty(); @@ -3515,6 +3538,7 @@ void CrushWrapper::dump_tunables(Formatter *f) const f->dump_int("has_v4_buckets", (int)has_v4_buckets()); f->dump_int("require_feature_tunables5", (int)has_nondefault_tunables5()); f->dump_int("has_v5_rules", (int)has_v5_rules()); + f->dump_int("has_msr_rules", (int)has_msr_rules()); } void CrushWrapper::dump_choose_args(Formatter *f) const diff --git a/src/crush/CrushWrapper.h b/src/crush/CrushWrapper.h index b8caa24ce621c..e84a829a2d3d5 100644 --- a/src/crush/CrushWrapper.h +++ b/src/crush/CrushWrapper.h @@ -329,13 +329,17 @@ public: bool has_v5_rules() const; bool has_choose_args() const; // any choose_args bool has_incompat_choose_args() const; // choose_args that can't be made compat + bool has_msr_rules() const; bool is_v2_rule(unsigned ruleid) const; bool is_v3_rule(unsigned ruleid) const; bool is_v5_rule(unsigned ruleid) const; + bool is_msr_rule(unsigned ruleid) const; std::string get_min_required_version() const { - if (has_v5_rules() || has_nondefault_tunables5()) + if (has_msr_rules()) + return "squid"; + else if (has_v5_rules() || has_nondefault_tunables5()) return "jewel"; else if (has_v4_buckets()) return "hammer"; diff --git a/src/crush/grammar.h b/src/crush/grammar.h index b5c356a49e17e..072b36b073aa0 100644 --- a/src/crush/grammar.h +++ b/src/crush/grammar.h @@ -170,7 +170,7 @@ struct crush_grammar : public boost::spirit::grammar step_emit ); crushrule = str_p("rule") >> !name >> '{' >> (str_p("id") | str_p("ruleset")) >> posint - >> str_p("type") >> ( str_p("replicated") | str_p("erasure") ) + >> str_p("type") >> ( str_p("replicated") | str_p("erasure") | str_p("msr_firstn") | str_p("msr_indep") ) >> !(str_p("min_size") >> posint) >> !(str_p("max_size") >> posint) >> +step diff --git a/src/include/ceph_features.h b/src/include/ceph_features.h index 1937eeb4c6987..23175adfa2c80 100644 --- a/src/include/ceph_features.h +++ b/src/include/ceph_features.h @@ -137,7 +137,7 @@ DEFINE_CEPH_FEATURE(34, 3, RANGE_BLOCKLIST) DEFINE_CEPH_FEATURE(35, 1, OSD_CACHEPOOL) // 3.14 DEFINE_CEPH_FEATURE(36, 1, CRUSH_V2) // 3.14 DEFINE_CEPH_FEATURE(37, 1, EXPORT_PEER) // 3.14 -DEFINE_CEPH_FEATURE_RETIRED(38, 1, OSD_ERASURE_CODES, MIMIC, OCTOPUS) +DEFINE_CEPH_FEATURE(38, 2, CRUSH_MSR) // X.XX TODOSAM kernel version? // available DEFINE_CEPH_FEATURE(39, 1, OSDMAP_ENC) // 3.15 DEFINE_CEPH_FEATURE(40, 1, MDS_INLINE_DATA) // 3.19 @@ -218,6 +218,7 @@ DEFINE_CEPH_FEATURE_RETIRED(63, 1, RESERVED_BROKEN, LUMINOUS, QUINCY) // client- CEPH_FEATURE_OSD_CACHEPOOL | \ CEPH_FEATURE_CRUSH_V2 | \ CEPH_FEATURE_EXPORT_PEER | \ + CEPH_FEATURE_CRUSH_MSR | \ CEPH_FEATURE_OSDMAP_ENC | \ CEPH_FEATURE_MDS_INLINE_DATA | \ CEPH_FEATURE_CRUSH_TUNABLES3 | \ @@ -265,9 +266,10 @@ DEFINE_CEPH_FEATURE_RETIRED(63, 1, RESERVED_BROKEN, LUMINOUS, QUINCY) // client- CEPH_FEATURE_CRUSH_TUNABLES2 | \ CEPH_FEATURE_CRUSH_TUNABLES3 | \ CEPH_FEATURE_CRUSH_TUNABLES5 | \ + CEPH_FEATURE_CRUSH_MSR | \ CEPH_FEATURE_CRUSH_V2 | \ CEPH_FEATURE_CRUSH_V4 | \ - CEPH_FEATUREMASK_CRUSH_CHOOSE_ARGS) + CEPH_FEATUREMASK_CRUSH_MSR) /* * make sure we don't try to use the reserved features diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 5773695b77ad3..209ec6db203d1 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -1789,6 +1789,8 @@ uint64_t OSDMap::get_features(int entity_type, uint64_t *pmask) const features |= CEPH_FEATURE_CRUSH_TUNABLES3; if (crush->is_v5_rule(ruleid)) features |= CEPH_FEATURE_CRUSH_TUNABLES5; + if (crush->is_msr_rule(ruleid)) + features |= CEPH_FEATURE_CRUSH_MSR; } } mask |= CEPH_FEATURE_OSDHASHPSPOOL | CEPH_FEATURE_OSD_CACHEPOOL; @@ -1843,6 +1845,9 @@ ceph_release_t OSDMap::get_min_compat_client() const { uint64_t f = get_features(CEPH_ENTITY_TYPE_CLIENT, nullptr); + if (HAVE_FEATURE(f, CRUSH_MSR)) { // TODOSAM -- add version right before merge + return ceph_release_t::squid; // v19.2.0 + } if (HAVE_FEATURE(f, OSDMAP_PG_UPMAP) || // v12.0.0-1733-g27d6f43 HAVE_FEATURE(f, CRUSH_CHOOSE_ARGS)) { // v12.0.1-2172-gef1ef28 return ceph_release_t::luminous; // v12.2.0 -- 2.39.5