From 64f2fe351d2c1e65a67c77a6c8fa432c5dd9273d Mon Sep 17 00:00:00 2001 From: Prashant D Date: Mon, 14 Sep 2020 22:27:21 -0400 Subject: [PATCH] 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) --- qa/standalone/mon/osd-erasure-code-profile.sh | 11 +++++++++++ src/mon/OSDMonitor.cc | 12 ++++++++++++ 2 files changed, 23 insertions(+) diff --git a/qa/standalone/mon/osd-erasure-code-profile.sh b/qa/standalone/mon/osd-erasure-code-profile.sh index 8aadbfa2f6321..8de643163b792 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 601abc88b910e..414c269312329 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; -- 2.39.5