]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Mon: When create pool use the crush rule consider the pool size 7359/head
authorsongbaisen <song.baisen@zte.com.cn>
Tue, 26 Jan 2016 07:33:59 +0000 (15:33 +0800)
committersongbaisen <song.baisen@zte.com.cn>
Wed, 9 Mar 2016 08:47:29 +0000 (16:47 +0800)
Fixes: #14509
Signed-off-by: song baisen song.baisen@zte.com.cn
src/mon/OSDMonitor.cc
src/test/Makefile.am
src/test/test_pool_create.sh [new file with mode: 0755]

index d63078eda98e5b2002e1c8f58a2fabecfb485680..8ae9970dd8adf50289b54b06a9300bc29bbf93e5 100644 (file)
@@ -4613,6 +4613,18 @@ int OSDMonitor::prepare_new_pool(string& name, uint64_t auid,
     dout(10) << " prepare_pool_size returns " << r << dendl;
     return r;
   }
+  const int64_t minsize = osdmap.crush->get_rule_mask_min_size(crush_ruleset);
+  if ((int64_t)size < minsize) {
+    *ss << "pool size " << size << " is smaller than crush ruleset name "
+        << crush_ruleset_name << " min size " << minsize;
+    return -EINVAL;
+  }
+  const int64_t maxsize = osdmap.crush->get_rule_mask_max_size(crush_ruleset);
+  if ((int64_t)size > maxsize) {
+    *ss << "pool size " << size << " is bigger than crush ruleset name "
+        << crush_ruleset_name << " max size " << maxsize;
+    return -EINVAL;
+  }
   uint32_t stripe_width = 0;
   r = prepare_pool_stripe_width(pool_type, erasure_code_profile, &stripe_width, ss);
   if (r) {
index 3d6353534d14c5db1827d42a3257e88cd9f6ce13..70c596a0203acfb38874fe4108cb8229c129265f 100644 (file)
@@ -69,6 +69,7 @@ check_SCRIPTS += \
        test/cephtool-test-mon.sh \
        test/cephtool-test-mds.sh \
        test/cephtool-test-rados.sh \
+       test/test_pool_create.sh \
        unittest_bufferlist.sh \
        test/encoding/check-generated.sh \
        test/mon/osd-pool-create.sh \
diff --git a/src/test/test_pool_create.sh b/src/test/test_pool_create.sh
new file mode 100755 (executable)
index 0000000..1d0c150
--- /dev/null
@@ -0,0 +1,58 @@
+#!/bin/bash
+
+
+#Generic create pool use crush rule  test
+#
+
+# Includes
+source ../qa/workunits/ceph-helpers.sh
+
+function run() {
+    local dir=$1
+    shift
+
+    export CEPH_MON="127.0.0.1:17108"
+    export CEPH_ARGS
+    CEPH_ARGS+="--fsid=$(uuidgen) --auth-supported=none "
+    CEPH_ARGS+="--mon-host=$CEPH_MON "
+
+    local funcs=${@:-$(set | sed -n -e 's/^\(TEST_[0-9a-z_]*\) .*/\1/p')}
+    for func in $funcs ; do
+        $func $dir || return 1
+    done
+}
+
+function TEST_pool_create() {
+    local dir=$1
+    setup $dir || return 1
+    run_mon $dir a || return 1
+    run_osd $dir 0 || return 1
+    run_osd $dir 1 || return 1
+    run_osd $dir 2 || return 1
+
+    local rulename=testrule
+    local poolname=rulepool
+    local var=`ceph osd crush rule dump|grep -w ruleset|sed -n '$p'|grep -o '[0-9]\+'`
+    var=`expr  $var + 1 `
+    ceph osd getcrushmap -o  map1
+    crushtool -d map1 -o map1.txt
+
+    local minsize=0
+    local maxsize=1
+    sed -i '/# end crush map/i\rule '$rulename' {\n ruleset \'$var'\n type replicated\n min_size \'$minsize'\n max_size \'$maxsize'\n step take default\n step choose firstn 0 type osd\n step emit\n }\n' map1.txt
+    crushtool  -c map1.txt -o  map1.bin
+    ceph osd setcrushmap -i map1.bin
+    ceph osd  pool create  $poolname 200 $rulename 2>rev
+    local result=$(cat rev|grep "Error EINVAL: pool size")
+
+    if [ "$result" = "" ];
+    then
+      ceph osd pool delete  $poolname $poolname  --yes-i-really-really-mean-it
+      ceph osd crush rule rm $rulename
+      return 1
+    fi
+    ceph osd crush rule rm $rulename
+}
+
+main testpoolcreate
+