]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mon/OSDMonitor: generalize rule type check for pools
authorSamuel Just <sjust@redhat.com>
Tue, 21 Nov 2023 23:39:23 +0000 (15:39 -0800)
committerSamuel Just <sjust@redhat.com>
Tue, 9 Jan 2024 03:25:55 +0000 (19:25 -0800)
Add rule_valid_for_pool_type to CrushWrapper to generalize
rule type <-> pool type mapping to include the new MSR
types.

Signed-off-by: Samuel Just <sjust@redhat.com>
src/crush/CrushWrapper.h
src/mon/OSDMonitor.cc
src/osd/OSDMap.cc

index 78e38fde4c5d138508646e3942b7b00c6cbdc54e..9cb1c487de9528ca802226a6a6caaa29ba222d5d 100644 (file)
@@ -602,6 +602,21 @@ public:
     if (have_rmaps)
       rule_name_rmap[name] = i;
   }
+  bool rule_valid_for_pool_type(int rule_id, int ptype) const {
+    auto rule_type = get_rule_type(rule_id);
+    switch (ptype) {
+    case CEPH_PG_TYPE_REPLICATED:
+      return rule_type == CRUSH_RULE_TYPE_REPLICATED ||
+       rule_type == CRUSH_RULE_TYPE_MSR_FIRSTN;
+    case CEPH_PG_TYPE_ERASURE:
+      return rule_type == CRUSH_RULE_TYPE_ERASURE ||
+       rule_type == CRUSH_RULE_TYPE_MSR_INDEP;
+    default:
+      ceph_assert(0 == "impossible");
+      return false;
+    }
+  }
+
   bool is_shadow_item(int id) const {
     const char *name = get_item_name(id);
     return name && !is_valid_crush_name(name);
index 05fabca0d09a45bb3525fd0cc5da6fc736413143..696d7f3185b364e5db0ef5cc001bccecbade0814 100644 (file)
@@ -8078,7 +8078,7 @@ int OSDMonitor::prepare_new_pool(string& name,
     return r;
   }
 
-  if (osdmap.crush->get_rule_type(crush_rule) != (int)pool_type) {
+  if (!osdmap.crush->rule_valid_for_pool_type(crush_rule, pool_type)) {
     *ss << "crush rule " << crush_rule << " type does not match pool";
     return -EINVAL;
   }
@@ -8350,7 +8350,7 @@ int OSDMonitor::prepare_command_pool_set(const cmdmap_t& cmdmap,
        return -EPERM;
       }
     }
-    if (osdmap.crush->get_rule_type(p.get_crush_rule()) != (int)p.type) {
+    if (!osdmap.crush->rule_valid_for_pool_type(p.get_crush_rule(), p.type)) {
       ss << "crush rule " << p.get_crush_rule() << " type does not match pool";
       return -EINVAL;
     }
@@ -8583,7 +8583,7 @@ int OSDMonitor::prepare_command_pool_set(const cmdmap_t& cmdmap,
       ss << cpp_strerror(id);
       return -ENOENT;
     }
-    if (osdmap.crush->get_rule_type(id) != (int)p.get_type()) {
+    if (!osdmap.crush->rule_valid_for_pool_type(id, p.get_type())) {
       ss << "crush rule " << id << " type does not match pool";
       return -EINVAL;
     }
index 8b3d2ad3711d31bc263e3164625c257bfc35753a..76552333dfff00b22e64952fa6590a097bdd5fd0 100644 (file)
@@ -4530,7 +4530,7 @@ int OSDMap::validate_crush_rules(CrushWrapper *newcrush,
          << " but it is not present";
       return -EINVAL;
     }
-    if (newcrush->get_rule_type(ruleno) != (int)pool.get_type()) {
+    if (!newcrush->rule_valid_for_pool_type(ruleno, pool.get_type())) {
       *ss << "pool " << i.first << " type does not match rule " << ruleno;
       return -EINVAL;
     }