]> git.apps.os.sepia.ceph.com Git - ceph.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>
Sun, 4 Feb 2024 05:00:11 +0000 (21:00 -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 f71f6d6ea79b6b942ef9996ea8dfe7ef9400b3bd..77f70d10049e6cbacebab94157b761014f49f54e 100644 (file)
@@ -602,6 +602,20 @@ 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_abort_msg("impossible");
+    }
+  }
+
   bool is_shadow_item(int id) const {
     const char *name = get_item_name(id);
     return name && !is_valid_crush_name(name);
index f8e379326f25f4439e685e75cc18fb391c08ab30..5e5cd0bfbebcac6da111d4c86e486b294fb41268 100644 (file)
@@ -8072,7 +8072,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;
   }
@@ -8344,7 +8344,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;
     }
@@ -8577,7 +8577,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 a6dd32c554d3c6aec0545f157ff6bfd158b45ea8..9853a0c8b2df8aa42a39053928127488cffab717 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;
     }