From: Ilya Dryomov Date: Fri, 15 May 2015 18:44:27 +0000 (+0300) Subject: CrushWrapper: validate default replicated ruleset config opt X-Git-Tag: v9.0.2~108^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=29f11c7b67d4712430f71c982a4a670fe55ff051;p=ceph.git CrushWrapper: validate default replicated ruleset config opt Validate osd_pool_default_crush_{replicated_ruleset,rule} config options, in particular when creating pools. Otherwise "ceph osd pool create foo " may end up creating pools with non-existent rulesets. Signed-off-by: Ilya Dryomov --- diff --git a/src/crush/CrushWrapper.cc b/src/crush/CrushWrapper.cc index fcf8b59c7d6..db7f6dd08a4 100644 --- a/src/crush/CrushWrapper.cc +++ b/src/crush/CrushWrapper.cc @@ -1645,6 +1645,8 @@ int CrushWrapper::get_osd_pool_default_crush_replicated_ruleset(CephContext *cct false); if (crush_ruleset == CEPH_DEFAULT_CRUSH_REPLICATED_RULESET) { crush_ruleset = find_first_ruleset(pg_pool_t::TYPE_REPLICATED); + } else if (!ruleset_exists(crush_ruleset)) { + crush_ruleset = -1; // match find_first_ruleset() retval } return crush_ruleset; diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 963f6ea6733..4ce89840204 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -2671,6 +2671,7 @@ int OSDMap::build_simple(CephContext *cct, epoch_t e, uuid_d &fsid, r = build_simple_crush_map(cct, *crush, nosd, &ss); else r = build_simple_crush_map_from_conf(cct, *crush, &ss); + assert(r == 0); int poolbase = get_max_osd() ? get_max_osd() : 1; @@ -2701,9 +2702,6 @@ int OSDMap::build_simple(CephContext *cct, epoch_t e, uuid_d &fsid, name_pool[*p] = pool; } - if (r < 0) - lderr(cct) << ss.str() << dendl; - for (int i=0; i&1 | \ + grep "No suitable CRUSH ruleset exists" || return 1 + CEPH_ARGS='' ./ceph --admin-daemon $dir/ceph-mon.a.asok log flush || return 1 + ! grep "osd_pool_default_crush_rule is deprecated " $dir/mon.a.log || return 1 +} + +function TEST_replicated_pool_with_non_existent_default_ruleset_1() { + local dir=$1 + run_mon $dir a || return 1 + # change the default crush rule using deprecated option + ./ceph tell mon.a injectargs -- \ + --osd_pool_default_crush_rule 55 || return 1 + ./ceph osd pool create mypool 12 12 replicated 2>&1 | \ + grep "No suitable CRUSH ruleset exists" || return 1 + CEPH_ARGS='' ./ceph --admin-daemon $dir/ceph-mon.a.asok log flush || return 1 + grep "osd_pool_default_crush_rule is deprecated " $dir/mon.a.log || return 1 +} + +function TEST_replicated_pool_with_non_existent_default_ruleset_2() { + local dir=$1 + run_mon $dir a || return 1 + ./ceph tell mon.a injectargs -- \ + --osd_pool_default_crush_rule 77 \ + --osd_pool_default_crush_replicated_ruleset 33 || return 1 + ./ceph osd pool create mypool 12 12 replicated 2>&1 | \ + grep "No suitable CRUSH ruleset exists" || return 1 + CEPH_ARGS='' ./ceph --admin-daemon $dir/ceph-mon.a.asok log flush || return 1 + grep "osd_pool_default_crush_rule is deprecated " $dir/mon.a.log || return 1 +} + function TEST_erasure_code_pool_lrc() { local dir=$1 run_mon $dir a || return 1