From: xie xingguo Date: Thu, 18 Oct 2018 08:56:57 +0000 (+0800) Subject: mon/OSDMonitor: do not remove device class still referenced by ec-profiles X-Git-Tag: 3.2-0~81^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5bcac3521379c1cd4b098a430f2e70679ccdd666;p=ceph-ci.git mon/OSDMonitor: do not remove device class still referenced by ec-profiles Signed-off-by: xie xingguo --- diff --git a/qa/standalone/crush/crush-classes.sh b/qa/standalone/crush/crush-classes.sh index 44fb97cb70f..509585db7e6 100755 --- a/qa/standalone/crush/crush-classes.sh +++ b/qa/standalone/crush/crush-classes.sh @@ -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 diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index bcb8b63c8e3..6b07331ad6f 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -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> old_ec_profiles = + osdmap.get_erasure_code_profiles(); + auto ec_profiles = pending_inc.get_erasure_code_profiles(); + ec_profiles.merge(old_ec_profiles); + list 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 osds; newcrush.get_devices_by_class(device_class, &osds); for (auto& p: osds) { diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index abaaddb5afa..d9bd0f40746 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -451,6 +451,9 @@ public: const map& profile) { new_erasure_code_profiles[name] = profile; } + mempool::osdmap::map> 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);