]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crush: add msr rule types and CrushWrapper infrastructure
authorSamuel Just <sjust@redhat.com>
Fri, 17 Nov 2023 04:09:45 +0000 (20:09 -0800)
committerSamuel Just <sjust@redhat.com>
Mon, 8 Jan 2024 18:50:16 +0000 (10:50 -0800)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crush/CrushCompiler.cc
src/crush/CrushWrapper.cc
src/crush/CrushWrapper.h
src/crush/grammar.h
src/include/ceph_features.h
src/osd/OSDMap.cc

index f7df0c6670ce85de46bf4856cd823bbd3268367a..740f003005b9a890d1dc80403165c5220bb7ad61 100644 (file)
@@ -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();
 
index 0f40e6875e1be84ac164d6e8697f714e95003fb9..5e3694c5193b4e62fe4bcc4860a2604c3463f48c 100644 (file)
@@ -135,6 +135,29 @@ bool CrushWrapper::is_v5_rule(unsigned ruleid) const
   return false;
 }
 
+bool CrushWrapper::has_msr_rules() const
+{
+  for (unsigned i=0; i<crush->max_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
index b8caa24ce621c989ec70820f59c3245cbc033636..e84a829a2d3d544621545d4571b27f95b9b5c539 100644 (file)
@@ -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";
index b5c356a49e17e8bafc9c18188a6fecf08e643b72..072b36b073aa07b8f2b263ce9a2fda96d9168a29 100644 (file)
@@ -170,7 +170,7 @@ struct crush_grammar : public boost::spirit::grammar<crush_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
index 1937eeb4c6987a8bffee5d335975d27dee113991..23175adfa2c8050277e4ba4cffedd43444e90d89 100644 (file)
@@ -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
index 5773695b77ad30dcdfb8ba22aa6740e576d9f597..209ec6db203d1788157eb2a4efcd70b3569a6ae0 100644 (file)
@@ -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