From: Vikhyat Umrao Date: Fri, 20 Jan 2017 20:14:31 +0000 (+0530) Subject: osd/Pool: Disallow enabling 'hashpspool' option to a pool without X-Git-Tag: v12.0.1~376^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3715362883acf9b8a477eb058a9ad6ee6d81ae01;p=ceph.git osd/Pool: Disallow enabling 'hashpspool' option to a pool without '--yes-i-really-mean-it' Fixes: http://tracker.ceph.com/issues/18468 Signed-off-by: Vikhyat Umrao --- diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh index 7df68e7c7f41..2165f154ca39 100755 --- a/qa/workunits/cephtool/test.sh +++ b/qa/workunits/cephtool/test.sh @@ -1467,7 +1467,7 @@ function test_mon_osd_pool_set() ceph --format=xml osd pool get $TEST_POOL_GETSET auid | grep $auid ceph osd pool set $TEST_POOL_GETSET auid 0 - for flag in hashpspool nodelete nopgchange nosizechange write_fadvise_dontneed noscrub nodeep-scrub; do + for flag in nodelete nopgchange nosizechange write_fadvise_dontneed noscrub nodeep-scrub; do ceph osd pool set $TEST_POOL_GETSET $flag false ceph osd pool get $TEST_POOL_GETSET $flag | grep "$flag: false" ceph osd pool set $TEST_POOL_GETSET $flag true @@ -1540,6 +1540,12 @@ function test_mon_osd_pool_set() ceph osd pool set $TEST_POOL_GETSET size 2 wait_for_clean ceph osd pool set $TEST_POOL_GETSET min_size 2 + + expect_false ceph osd pool set $TEST_POOL_GETSET hashpspool 0 + ceph osd pool set $TEST_POOL_GETSET hashpspool 0 --yes-i-really-mean-it + + expect_false ceph osd pool set $TEST_POOL_GETSET hashpspool 1 + ceph osd pool set $TEST_POOL_GETSET hashpspool 1 --yes-i-really-mean-it ceph osd pool set $TEST_POOL_GETSET nodelete 1 expect_false ceph osd pool delete $TEST_POOL_GETSET $TEST_POOL_GETSET --yes-i-really-really-mean-it diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 881a4611ec5a..63f141f585dc 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -5268,7 +5268,7 @@ int OSDMonitor::prepare_command_pool_set(map &cmdmap, return -EINVAL; } p.crush_ruleset = n; - } else if (var == "hashpspool" || var == "nodelete" || var == "nopgchange" || + } else if (var == "nodelete" || var == "nopgchange" || var == "nosizechange" || var == "write_fadvise_dontneed" || var == "noscrub" || var == "nodeep-scrub") { uint64_t flag = pg_pool_t::get_flag_by_name(var); @@ -5281,6 +5281,25 @@ int OSDMonitor::prepare_command_pool_set(map &cmdmap, ss << "expecting value 'true', 'false', '0', or '1'"; return -EINVAL; } + } else if (var == "hashpspool") { + uint64_t flag = pg_pool_t::get_flag_by_name(var); + string force; + cmd_getval(g_ceph_context, cmdmap, "force", force); + if (force != "--yes-i-really-mean-it") { + ss << "are you SURE? this will remap all placement groups in this pool," + " this triggers large data movement," + " pass --yes-i-really-mean-it if you really do."; + return -EPERM; + } + // make sure we only compare against 'n' if we didn't receive a string + if (val == "true" || (interr.empty() && n == 1)) { + p.set_flag(flag); + } else if (val == "false" || (interr.empty() && n == 0)) { + p.unset_flag(flag); + } else { + ss << "expecting value 'true', 'false', '0', or '1'"; + return -EINVAL; + } } else if (var == "hit_set_type") { if (val == "none") p.hit_set_params = HitSet::Params(); diff --git a/src/test/mon/misc.sh b/src/test/mon/misc.sh index 91b0b82aa6a3..cc7d8f97611b 100755 --- a/src/test/mon/misc.sh +++ b/src/test/mon/misc.sh @@ -42,12 +42,7 @@ function TEST_osd_pool_get_set() { run_mon $dir a || return 1 local flag - for flag in hashpspool nodelete nopgchange nosizechange write_fadvise_dontneed noscrub nodeep-scrub; do - if [ $flag = hashpspool ]; then - ceph osd dump | grep 'pool ' | grep $flag || return 1 - else - ! ceph osd dump | grep 'pool ' | grep $flag || return 1 - fi + for flag in nodelete nopgchange nosizechange write_fadvise_dontneed noscrub nodeep-scrub; do ceph osd pool set $TEST_POOL $flag 0 || return 1 ! ceph osd dump | grep 'pool ' | grep $flag || return 1 ceph osd pool set $TEST_POOL $flag 1 || return 1