From: Prashant D Date: Tue, 15 Sep 2020 02:27:21 +0000 (-0400) Subject: mon: validate crush-failure-domain X-Git-Tag: v14.2.17~60^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=64f2fe351d2c1e65a67c77a6c8fa432c5dd9273d;p=ceph.git mon: validate crush-failure-domain While creating erasure-coded profile make sure that user is specifying valid crush-failure-domain. Fixes: https://tracker.ceph.com/issues/47452 Signed-off-by: Prashant Dhange (cherry picked from commit f8b7fddc4c4a787d58fb9efef6ecb13cf878f92b) --- diff --git a/qa/standalone/mon/osd-erasure-code-profile.sh b/qa/standalone/mon/osd-erasure-code-profile.sh index 8aadbfa2f632..8de643163b79 100755 --- a/qa/standalone/mon/osd-erasure-code-profile.sh +++ b/qa/standalone/mon/osd-erasure-code-profile.sh @@ -222,6 +222,17 @@ function TEST_profile_k_sanity() { m=1 || return 1 } +function TEST_invalid_crush_failure_domain() { + local dir=$1 + + run_mon $dir a || return 1 + + local profile=ec_profile + local crush_failure_domain=invalid_failure_domain + + ! ceph osd erasure-code-profile set $profile k=4 m=2 crush-failure-domain=$crush_failure_domain 2>&1 || return 1 +} + main osd-erasure-code-profile "$@" # Local Variables: diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 601abc88b910..414c26931232 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -10431,6 +10431,18 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, err = parse_erasure_code_profile(profile, &profile_map, &ss); if (err) goto reply; + if (auto found = profile_map.find("crush-failure-domain"); + found != profile_map.end()) { + const auto& failure_domain = found->second; + int failure_domain_type = osdmap.crush->get_type_id(failure_domain); + if (failure_domain_type < 0) { + ss << "erasure-code-profile " << profile_map + << " contains an invalid failure-domain " << std::quoted(failure_domain); + err = -EINVAL; + goto reply; + } + } + if (profile_map.find("plugin") == profile_map.end()) { ss << "erasure-code-profile " << profile_map << " must contain a plugin entry" << std::endl;