]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mon/OSDMonitor: do not remove device class still referenced by ec-profiles
authorxie xingguo <xie.xingguo@zte.com.cn>
Thu, 18 Oct 2018 08:56:57 +0000 (16:56 +0800)
committerxiexingguo <xie.xingguo@gmail.com>
Tue, 23 Oct 2018 13:17:56 +0000 (21:17 +0800)
Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
qa/standalone/crush/crush-classes.sh
src/mon/OSDMonitor.cc
src/osd/OSDMap.h

index 44fb97cb70f8e47e453b023b3c606660c8605037..509585db7e6a1837117593b9ce3fd1c6de2843df 100755 (executable)
@@ -155,6 +155,9 @@ function TEST_mon_classes() {
     ceph osd crush class ls | grep TEMP || return 1
     ceph osd crush class rename TEMP CLASS || return 1
     ceph osd crush class ls | grep CLASS  || return 1
+    ceph osd erasure-code-profile set myprofile plugin=jerasure technique=reed_sol_van k=2 m=1 crush-failure-domain=osd crush-device-class=CLASS || return 1
+    expect_failure $dir EBUSY ceph osd crush class rm CLASS || return 1
+    ceph osd erasure-code-profile rm myprofile || return 1
     ceph osd crush class rm CLASS || return 1
     ceph osd crush class rm CLASS || return 1 # test idempotence
 
index bcb8b63c8e3ef380e5acefbe859c3d9ec11617dd..6b07331ad6fa5cc74d3239b161a2de5ed1a0ddbc 100644 (file)
@@ -8614,6 +8614,26 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
        goto reply;
      }
 
+     // check if class is used by any erasure-code-profiles
+     mempool::osdmap::map<string,map<string,string>> old_ec_profiles =
+       osdmap.get_erasure_code_profiles();
+     auto ec_profiles = pending_inc.get_erasure_code_profiles();
+     ec_profiles.merge(old_ec_profiles);
+     list<string> referenced_by;
+     for (auto &i: ec_profiles) {
+       for (auto &j: i.second) {
+         if ("crush-device-class" == j.first && device_class == j.second) {
+           referenced_by.push_back(i.first);
+         }
+       }
+     }
+     if (!referenced_by.empty()) {
+       err = -EBUSY;
+       ss << "class '" << device_class
+          << "' is still referenced by erasure-code-profile(s): " << referenced_by;
+       goto reply;
+     }
+
      set<int> osds;
      newcrush.get_devices_by_class(device_class, &osds);
      for (auto& p: osds) {
index abaaddb5afad8468c496f5104957527d5fa89813..d9bd0f4074681f0a88f9f9f83b2c30eb70bf249b 100644 (file)
@@ -451,6 +451,9 @@ public:
                                  const map<string,string>& profile) {
       new_erasure_code_profiles[name] = profile;
     }
+    mempool::osdmap::map<string,map<string,string>> get_erasure_code_profiles() const {
+      return new_erasure_code_profiles;
+    }
 
     /// propagate update pools' snap metadata to any of their tiers
     int propagate_snaps_to_tiers(CephContext *cct, const OSDMap &base);