]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/Pool: Disallow enabling 'hashpspool' option to a pool without 13406/head
authorVikhyat Umrao <vumrao@redhat.com>
Fri, 20 Jan 2017 20:14:31 +0000 (01:44 +0530)
committerVikhyat Umrao <vumrao@redhat.com>
Mon, 13 Feb 2017 22:39:32 +0000 (04:09 +0530)
          '--yes-i-really-mean-it'

Fixes: http://tracker.ceph.com/issues/18468
Signed-off-by: Vikhyat Umrao <vumrao@redhat.com>
qa/workunits/cephtool/test.sh
src/mon/OSDMonitor.cc
src/test/mon/misc.sh

index 7df68e7c7f410dfa6020682632cf0abf92ded1cd..2165f154ca392d2c495b2dbbc68a35d926edff84 100755 (executable)
@@ -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
index 881a4611ec5a50c6a1f8caa1a9244c86dad66036..63f141f585dc5794977edd0044073dd752134c7b 100644 (file)
@@ -5268,7 +5268,7 @@ int OSDMonitor::prepare_command_pool_set(map<string,cmd_vartype> &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<string,cmd_vartype> &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();
index 91b0b82aa6a38a72fef4e170402a6622deaf98f5..cc7d8f97611be64e7fd7c0cd6fcc81fe3a8c3a14 100755 (executable)
@@ -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