From: Loic Dachary Date: Thu, 13 Feb 2014 09:23:28 +0000 (+0100) Subject: mon: osd create pool test refactor X-Git-Tag: v0.78~184^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7ff27566fa2759a16ac4ac2eab74703f42cead4e;p=ceph.git mon: osd create pool test refactor * Use test-helpers.sh instead of duplicating it * Isolate each test in a separate function for clarity Signed-off-by: Loic Dachary --- diff --git a/src/test/mon/osd-pool-create.sh b/src/test/mon/osd-pool-create.sh index 39c6918da3a4..c24bd38f7812 100755 --- a/src/test/mon/osd-pool-create.sh +++ b/src/test/mon/osd-pool-create.sh @@ -14,172 +14,181 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library Public License for more details. # -set -xe -PS4='$LINENO: ' - -DIR=osd-pool-create -rm -fr $DIR -trap "test \$? = 0 || cat $DIR/log ; set +x ; kill_mon || true && rm -fr $DIR" EXIT -mkdir $DIR -export CEPH_ARGS="--conf /dev/null --auth-supported=none --mon-host=127.0.0.1" - -function run_mon() { - ./ceph-mon --id a \ - --public-addr=127.0.0.1 --mkfs \ - --fsid=$(uuidgen) --mon-data=$DIR --run-dir=$DIR - - ./ceph-mon --id a \ - --chdir= \ - --paxos-propose-interval=0.1 \ - --osd-pool-default-erasure-code-directory=.libs \ - --mon-data=$DIR \ - --log-file=$DIR/log \ - --mon-cluster-log-file=$DIR/log \ - --run-dir=$DIR \ - --pid-file=$DIR/pidfile \ - "$@" -} +source test/mon/mon-test-helpers.sh + +function run() { + local dir=$1 -function kill_mon() { - for try in 0 1 1 1 2 3 ; do - if [ ! -e $DIR/pidfile ] || - ! kill -9 $(cat $DIR/pidfile) ; then - break - fi - sleep $try + export CEPH_ARGS + CEPH_ARGS+="--fsid=$(uuidgen) --auth-supported=none " + CEPH_ARGS+="--mon-host=127.0.0.1 " + + for TEST_function in $(set | sed -n -e 's/^\(TEST_[0-9a-z_]*\) .*/\1/p') ; do + setup $dir || return 1 + $TEST_function $dir || return 1 + teardown $dir || return 1 done +} + +function TEST_default_deprectated_0() { + local dir=$1 + # explicitly set the default crush rule + expected=66 + run_mon $dir a --public-addr 127.0.0.1 \ + --osd_pool_default_crush_replicated_ruleset $expected + ./ceph --format json osd dump | grep '"crush_ruleset":'$expected + ! grep "osd_pool_default_crush_rule is deprecated " $dir/a/log || return 1 +} + +function TEST_default_deprectated_1() { + local dir=$1 + # explicitly set the default crush rule using deprecated option + expected=55 + run_mon $dir a --public-addr 127.0.0.1 \ + --osd_pool_default_crush_rule $expected + ./ceph --format json osd dump | grep '"crush_ruleset":'$expected + grep "osd_pool_default_crush_rule is deprecated " $dir/a/log || return 1 +} + +function TEST_default_deprectated_2() { + local dir=$1 + expected=77 + unexpected=33 + run_mon $dir a --public-addr 127.0.0.1 \ + --osd_pool_default_crush_rule $expected \ + --osd_pool_default_crush_replicated_ruleset $unexpected + ./ceph --format json osd dump | grep '"crush_ruleset":'$expected + ! ./ceph --format json osd dump | grep '"crush_ruleset":'$unexpected || return 1 + grep "osd_pool_default_crush_rule is deprecated " $dir/a/log || return 1 +} + +function TEST_erasure_crush_rule() { + local dir=$1 + run_mon $dir a --public-addr 127.0.0.1 + crush_ruleset=erasure_ruleset + ./ceph osd crush rule create-erasure $crush_ruleset + ./ceph osd crush rule ls | grep $crush_ruleset + ./ceph osd pool create pool_erasure 12 12 erasure 2>&1 | \ + grep 'crush_ruleset is missing' || return 1 + ! ./ceph osd pool create pool_erasure 12 12 erasure crush_ruleset=WRONG > $dir/out 2>&1 + grep 'WRONG does not exist' $dir/out || return 1 + grep 'EINVAL' $dir/out || return 1 + ! ./ceph --format json osd dump | grep '"crush_ruleset":1' || return 1 + ./ceph osd pool create pool_erasure 12 12 erasure crush_ruleset=$crush_ruleset + ./ceph --format json osd dump | grep '"crush_ruleset":1' || return 1 +} + +function TEST_erasure_crush_rule_pending() { + local dir=$1 + run_mon $dir a --public-addr 127.0.0.1 + # try again if the ruleset creation is pending + crush_ruleset=erasure_ruleset + # add to the pending OSD map without triggering a paxos proposal + result=$(echo '{"prefix":"osdmonitor_prepare_command","prepare":"osd crush rule create-erasure","name":"'$crush_ruleset'"}' | nc -U $dir/a/ceph-mon.a.asok | cut --bytes=5-) + test $result = true || return 1 + ./ceph osd pool create pool_erasure 12 12 erasure crush_ruleset=$crush_ruleset || return 1 + grep "$crush_ruleset try again" $dir/a/log || return 1 +} + +function TEST_erasure_code_property_format() { + local dir=$1 + # osd_pool_default_erasure_code_properties is + # valid JSON but not of the expected type + run_mon $dir a --public-addr 127.0.0.1 \ + --osd_pool_default_erasure_code_properties 1 + ./ceph osd pool create poolA 12 12 erasure 2>&1 | grep 'must be a JSON object' || return 1 +} + +function TEST_erasure_crush_property_format_json() { + local dir=$1 + # osd_pool_default_erasure_code_properties is JSON + expected='"erasure-code-plugin":"example"' + run_mon $dir a --public-addr 127.0.0.1 \ + --osd_pool_default_erasure_code_properties "{$expected}" + ! ./ceph --format json osd dump | grep "$expected" || return 1 + crush_ruleset=erasure_ruleset + ./ceph osd crush rule create-erasure $crush_ruleset + ./ceph osd pool create pool_erasure 12 12 erasure crush_ruleset=$crush_ruleset + ./ceph --format json osd dump | grep "$expected" || return 1 +} + +function TEST_erasure_crush_property_format_plain() { + local dir=$1 + # osd_pool_default_erasure_code_properties is plain text + expected='"erasure-code-plugin":"example"' + run_mon $dir a --public-addr 127.0.0.1 \ + --osd_pool_default_erasure_code_properties "erasure-code-plugin=example" + ! ./ceph --format json osd dump | grep "$expected" || return 1 + crush_ruleset=erasure_ruleset + ./ceph osd crush rule create-erasure $crush_ruleset + ./ceph osd pool create pool_erasure 12 12 erasure crush_ruleset=$crush_ruleset + ./ceph --format json osd dump | grep "$expected" || return 1 +} + +function TEST_erasure_crush_stripe_width() { + local dir=$1 + # the default stripe width is used to initialize the pool + run_mon $dir a --public-addr 127.0.0.1 + stripe_width=$(./ceph-conf --show-config-value osd_pool_erasure_code_stripe_width) + crush_ruleset=erasure_ruleset + ./ceph osd crush rule create-erasure $crush_ruleset + ./ceph osd pool create pool_erasure 12 12 erasure crush_ruleset=$crush_ruleset + ./ceph --format json osd dump | tee $dir/osd.json + grep '"stripe_width":'$stripe_width $dir/osd.json > /dev/null || return 1 +} + +function TEST_erasure_crush_stripe_width_padded() { + local dir=$1 + # setting osd_pool_erasure_code_stripe_width modifies the stripe_width + # and it is padded as required by the default plugin + properties+=" erasure-code-plugin=jerasure" + properties+=" erasure-code-technique=reed_sol_van" + k=4 + properties+=" erasure-code-k=$k" + properties+=" erasure-code-m=2" + expected_chunk_size=2048 + actual_stripe_width=$(($expected_chunk_size * $k)) + desired_stripe_width=$(($actual_stripe_width - 1)) + run_mon $dir a --public-addr 127.0.0.1 \ + --osd_pool_erasure_code_stripe_width $desired_stripe_width \ + --osd_pool_default_erasure_code_properties "$properties" + crush_ruleset=erasure_ruleset + ./ceph osd crush rule create-erasure $crush_ruleset + ./ceph osd pool create pool_erasure 12 12 erasure crush_ruleset=$crush_ruleset + ./ceph osd dump | tee $dir/osd.json + grep "stripe_width $actual_stripe_width" $dir/osd.json > /dev/null || return 1 +} + +function TEST_erasure_code_pool() { + local dir=$1 + run_mon $dir a --public-addr 127.0.0.1 + ./ceph --format json osd dump > $dir/osd.json + ! grep "erasure-code-plugin" $dir/osd.json || return 1 + ./ceph osd crush rule create-erasure erasure_ruleset + ./ceph osd pool create erasurecodes 12 12 erasure crush_ruleset=erasure_ruleset + ./ceph --format json osd dump | tee $dir/osd.json + grep "erasure-code-plugin" $dir/osd.json > /dev/null || return 1 + grep "erasure-code-directory" $dir/osd.json > /dev/null || return 1 + + ./ceph osd pool create erasurecodes 12 12 erasure 2>&1 | \ + grep 'already exists' || return 1 + ./ceph osd pool create erasurecodes 12 12 2>&1 | \ + grep 'cannot change to type replicated' || return 1 +} - rm -fr $DIR/* +function TEST_replicated_pool() { + local dir=$1 + run_mon $dir a --public-addr 127.0.0.1 + ./ceph osd pool create replicated 12 12 replicated + ./ceph osd pool create replicated 12 12 replicated 2>&1 | \ + grep 'already exists' || return 1 + ./ceph osd pool create replicated 12 12 # default is replicated + ./ceph osd pool create replicated 12 # default is replicated, pgp_num = pg_num + ./ceph osd pool create replicated 12 12 erasure 2>&1 | \ + grep 'cannot change to type erasure' || return 1 } -# explicitly set the default crush rule -expected=66 -run_mon --osd_pool_default_crush_replicated_ruleset $expected -./ceph --format json osd dump | grep '"crush_ruleset":'$expected -! grep "osd_pool_default_crush_rule is deprecated " $DIR/log || exit 1 -kill_mon - -# explicitly set the default crush rule using deprecated option -expected=55 -run_mon --osd_pool_default_crush_rule $expected -./ceph --format json osd dump | grep '"crush_ruleset":'$expected -grep "osd_pool_default_crush_rule is deprecated " $DIR/log -kill_mon - -expected=77 -unexpected=33 -run_mon \ - --osd_pool_default_crush_rule $expected \ - --osd_pool_default_crush_replicated_ruleset $unexpected -./ceph --format json osd dump | grep '"crush_ruleset":'$expected -! ./ceph --format json osd dump | grep '"crush_ruleset":'$unexpected || exit 1 -grep "osd_pool_default_crush_rule is deprecated " $DIR/log -kill_mon - -# osd_pool_default_erasure_code_properties is -# valid JSON but not of the expected type -run_mon --osd_pool_default_erasure_code_properties 1 -./ceph osd pool create poolA 12 12 erasure 2>&1 | grep 'must be a JSON object' -kill_mon - -# set the erasure crush rule -run_mon -crush_ruleset=erasure_ruleset -./ceph osd crush rule create-erasure $crush_ruleset -./ceph osd crush rule ls | grep $crush_ruleset -./ceph osd pool create pool_erasure 12 12 erasure 2>&1 | - grep 'crush_ruleset is missing' -! ./ceph osd pool create pool_erasure 12 12 erasure crush_ruleset=WRONG > $DIR/out 2>&1 -grep 'WRONG does not exist' $DIR/out -grep 'EINVAL' $DIR/out -! ./ceph --format json osd dump | grep '"crush_ruleset":1' || exit 1 -./ceph osd pool create pool_erasure 12 12 erasure crush_ruleset=$crush_ruleset -./ceph --format json osd dump | grep '"crush_ruleset":1' -kill_mon - -# try again if the ruleset creation is pending -run_mon --mon-advanced-debug-mode --debug-mon=20 --debug-paxos=20 -crush_ruleset=erasure_ruleset -# add to the pending OSD map without triggering a paxos proposal -result=$(echo '{"prefix":"osdmonitor_prepare_command","prepare":"osd crush rule create-erasure","name":"'$crush_ruleset'"}' | nc -U $DIR/ceph-mon.a.asok | cut --bytes=5-) -test $result = true || exit 1 -./ceph osd pool create pool_erasure 12 12 erasure crush_ruleset=$crush_ruleset -grep "$crush_ruleset try again" $DIR/log -kill_mon - -# osd_pool_default_erasure_code_properties is JSON -expected='"erasure-code-plugin":"example"' -run_mon --osd_pool_default_erasure_code_properties "{$expected}" -! ./ceph --format json osd dump | grep "$expected" || exit 1 -crush_ruleset=erasure_ruleset -./ceph osd crush rule create-erasure $crush_ruleset -./ceph osd pool create pool_erasure 12 12 erasure crush_ruleset=$crush_ruleset -./ceph --format json osd dump | grep "$expected" -kill_mon - -# osd_pool_default_erasure_code_properties is plain text -expected='"erasure-code-plugin":"example"' -run_mon --osd_pool_default_erasure_code_properties "erasure-code-plugin=example" -! ./ceph --format json osd dump | grep "$expected" || exit 1 -crush_ruleset=erasure_ruleset -./ceph osd crush rule create-erasure $crush_ruleset -./ceph osd pool create pool_erasure 12 12 erasure crush_ruleset=$crush_ruleset -./ceph --format json osd dump | grep "$expected" -kill_mon - -# the default stripe width is used to initialize the pool -run_mon -stripe_width=$(./ceph-conf --show-config-value osd_pool_erasure_code_stripe_width) -crush_ruleset=erasure_ruleset -./ceph osd crush rule create-erasure $crush_ruleset -./ceph osd pool create pool_erasure 12 12 erasure crush_ruleset=$crush_ruleset -./ceph --format json osd dump | tee $DIR/osd.json -grep '"stripe_width":'$stripe_width $DIR/osd.json > /dev/null -kill_mon - -# setting osd_pool_erasure_code_stripe_width modifies the stripe_width -# and it is padded as required by the default plugin -properties+=" erasure-code-plugin=jerasure" -properties+=" erasure-code-technique=reed_sol_van" -k=4 -properties+=" erasure-code-k=$k" -properties+=" erasure-code-m=2" -expected_chunk_size=2048 -actual_stripe_width=$(($expected_chunk_size * $k)) -desired_stripe_width=$(($actual_stripe_width - 1)) -run_mon \ - --osd_pool_erasure_code_stripe_width $desired_stripe_width \ - --osd_pool_default_erasure_code_properties "$properties" -crush_ruleset=erasure_ruleset -./ceph osd crush rule create-erasure $crush_ruleset -./ceph osd pool create pool_erasure 12 12 erasure crush_ruleset=$crush_ruleset -./ceph osd dump | tee $DIR/osd.json -grep "stripe_width $actual_stripe_width" $DIR/osd.json > /dev/null -kill_mon - -run_mon -# creating an erasure code pool sets defaults properties -./ceph --format json osd dump > $DIR/osd.json -! grep "erasure-code-plugin" $DIR/osd.json || exit 1 -./ceph osd crush rule create-erasure erasure_ruleset -./ceph osd pool create erasurecodes 12 12 erasure crush_ruleset=erasure_ruleset -./ceph --format json osd dump | tee $DIR/osd.json -grep "erasure-code-plugin" $DIR/osd.json > /dev/null -grep "erasure-code-directory" $DIR/osd.json > /dev/null - -./ceph osd pool create erasurecodes 12 12 erasure 2>&1 | - grep 'already exists' -./ceph osd pool create erasurecodes 12 12 2>&1 | - grep 'cannot change to type replicated' -./ceph osd pool create replicated 12 12 replicated -./ceph osd pool create replicated 12 12 replicated 2>&1 | - grep 'already exists' -./ceph osd pool create replicated 12 12 # default is replicated -./ceph osd pool create replicated 12 # default is replicated, pgp_num = pg_num -./ceph osd pool create replicated 12 12 erasure 2>&1 | - grep 'cannot change to type erasure' - -kill_mon +main osd-pool-create # Local Variables: # compile-command: "cd ../.. ; make -j4 && test/mon/osd-pool-create.sh"