X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity-quota.sh;h=daa6f2788a691405d14513de0f5dc03c1e65e84c;hb=c2db06180b29a6f10e381c06819eea362c840ad2;hp=58cd433f5b3411f578a0e933d362c8b08593787f;hpb=dee5f24114531ec34fc56ce2826ada9e5690aabc;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity-quota.sh b/lustre/tests/sanity-quota.sh index 58cd433..daa6f27 100644 --- a/lustre/tests/sanity-quota.sh +++ b/lustre/tests/sanity-quota.sh @@ -34,8 +34,6 @@ init_test_env $@ init_logging DIRECTIO=${DIRECTIO:-$LUSTRE/tests/directio} -[ $MDSCOUNT -gt 1 ] && skip "CMD case" && exit 0 - require_dsh_mds || exit 0 require_dsh_ost || exit 0 @@ -99,12 +97,15 @@ lustre_fail() { RUNAS="runas -u $TSTID -g $TSTID" RUNAS2="runas -u $TSTID2 -g $TSTID2" -FAIL_ON_ERROR=true check_runas_id $TSTID $TSTID $RUNAS -FAIL_ON_ERROR=true check_runas_id $TSTID2 $TSTID2 $RUNAS2 DD="dd if=/dev/zero bs=1M" FAIL_ON_ERROR=false +check_runas_id_ret $TSTUSR $TSTUSR $RUNAS || + error "Please create user $TSTUSR($TSTID) and group $TSTUSR($TSTID)" +check_runas_id_ret $TSTUSR2 $TSTUSR2 $RUNAS2 || + error "Please create user $TSTUSR2($TSTID2) and group $TSTUSR2($TSTID2)" + # clear quota limits for a user or a group # usage: resetquota -u username # resetquota -g groupname @@ -114,13 +115,10 @@ resetquota() { [ "$1" != "-u" -a "$1" != "-g" ] && error "resetquota: wrong specifier $1 passed" - $LFS setquota "$1" "$2" -b 0 -B 0 -i 0 -I 0 $MOUNT - # The usage should be 0 now, enforce quota to trigger quota - # release for each slave, sleep 3 seconds to wait for the release - # done, then we can make sure granted quota for each slave is 0. - $LFS setquota "$1" "$2" -b 0 -B 1 -i 0 -I 1 $MOUNT - sleep 3 - $LFS setquota "$1" "$2" -b 0 -B 0 -i 0 -I 0 $MOUNT + $LFS setquota "$1" "$2" -b 0 -B 0 -i 0 -I 0 $MOUNT || + error "clear quota for [type:$1 name:$2] failed" + # give a chance to slave to release space + sleep 1 } quota_scan() { @@ -192,30 +190,41 @@ getquota() { # usage: set_mdt_qtype ug|u|g|none set_mdt_qtype() { local qtype=$1 - local varsvc=${SINGLEMDS}_svc + local varsvc + local mdts=$(get_facets MDS) + local cmd do_facet mgs $LCTL conf_param $FSNAME.quota.mdt=$qtype - if $(facet_up $SINGLEMDS); then - wait_update_facet $SINGLEMDS "$LCTL get_param -n \ - osd-$FSTYPE.${!varsvc}.quota_slave.enabled" "$qtype" || - return 1 - fi + # we have to make sure each MDT received config changes + for mdt in ${mdts//,/ }; do + varsvc=${mdt}_svc + cmd="$LCTL get_param -n " + cmd=${cmd}osd-$(facet_fstype $mdt).${!varsvc} + cmd=${cmd}.quota_slave.enabled + + if $(facet_up $mdt); then + wait_update_facet $mdt "$cmd" "$qtype" || return 1 + fi + done return 0 } # set ost quota type -# usage: set_ost_quota_type ug|u|g|none +# usage: set_ost_qtype ug|u|g|none set_ost_qtype() { local qtype=$1 local varsvc local osts=$(get_facets OST) + local cmd do_facet mgs $LCTL conf_param $FSNAME.quota.ost=$qtype # we have to make sure each OST received config changes for ost in ${osts//,/ }; do varsvc=${ost}_svc + cmd="$LCTL get_param -n " + cmd=${cmd}osd-$(facet_fstype $ost).${!varsvc} + cmd=${cmd}.quota_slave.enabled + if $(facet_up $ost); then - wait_update_facet $ost "$LCTL get_param -n \ - osd-$FSTYPE.${!varsvc}.quota_slave.enabled" \ - "$qtype" || return 1 + wait_update_facet $ost "$cmd" "$qtype" || return 1 fi done return 0 @@ -224,54 +233,57 @@ set_ost_qtype() { wait_reintegration() { local ntype=$1 local qtype=$2 + local max=$3 local result="glb[1],slv[1],reint[0]" local varsvc + local cmd + local tgts if [ $ntype == "mdt" ]; then - varsvc=${SINGLEMDS}_svc - if $(facet_up $SINGLEMDS); then - wait_update_facet $SINGLEMDS "$LCTL get_param -n \ - osd-$FSTYPE.${!varsvc}.quota_slave.info | - grep "$qtype" | awk '{ print \\\$3 }'" "$result" || - return 1 - fi + tgts=$(get_facets MDS) else - local osts=$(get_facets OST) - for ost in ${osts//,/ }; do - varsvc=${ost}_svc - if $(facet_up $ost); then - wait_update_facet $ost "$LCTL get_param -n \ - osd-$FSTYPE.${!varsvc}.quota_slave.info | - grep "$qtype" | awk '{ print \\\$3 }'" \ - "$result" || return 1 - fi - done + tgts=$(get_facets OST) fi + + for tgt in ${tgts//,/ }; do + varsvc=${tgt}_svc + cmd="$LCTL get_param -n " + cmd=${cmd}osd-$(facet_fstype $tgt).${!varsvc} + cmd=${cmd}.quota_slave.info + + if $(facet_up $tgt); then + wait_update_facet $tgt "$cmd | + grep "$qtype" | awk '{ print \\\$3 }'" \ + "$result" $max || return 1 + fi + done return 0 } wait_mdt_reint() { local qtype=$1 + local max=${2:-90} if [ $qtype == "u" ] || [ $qtype == "ug" ]; then - wait_reintegration "mdt" "user" || return 1 + wait_reintegration "mdt" "user" $max || return 1 fi if [ $qtype == "g" ] || [ $qtype == "ug" ]; then - wait_reintegration "mdt" "group" || return 1 + wait_reintegration "mdt" "group" $max || return 1 fi return 0 } wait_ost_reint() { local qtype=$1 + local max=${2:-90} if [ $qtype == "u" ] || [ $qtype == "ug" ]; then - wait_reintegration "ost" "user" || return 1 + wait_reintegration "ost" "user" $max || return 1 fi if [ $qtype == "g" ] || [ $qtype == "ug" ]; then - wait_reintegration "ost" "group" || return 1 + wait_reintegration "ost" "group" $max || return 1 fi return 0 } @@ -281,7 +293,7 @@ setup_quota_test() { wait_delete_completed echo "Creating test directory" mkdir -p $DIR/$tdir - chmod 077 $DIR/$tdir + chmod 0777 $DIR/$tdir # always clear fail_loc in case of fail_loc isn't cleared # properly when previous test failed lustre_fail mds_ost 0 @@ -333,6 +345,11 @@ quota_init() { } quota_init +resetquota -u $TSTUSR +resetquota -g $TSTUSR +resetquota -u $TSTUSR2 +resetquota -g $TSTUSR2 + test_quota_performance() { local TESTFILE="$DIR/$tdir/$tfile-0" local size=$1 # in MB @@ -351,17 +368,22 @@ test_quota_performance() { # test basic quota performance b=21696 test_0() { - setup_quota_test - trap cleanup_quota_test EXIT - local MB=100 # 100M [ "$SLOW" = "no" ] && MB=10 + local free_space=$(lfs_df | grep "summary" | awk '{print $4}') + [ $free_space -le $((MB * 1024)) ] && + skip "not enough space ${free_space} KB, " \ + "required $((MB * 1024)) KB" && return + setup_quota_test + trap cleanup_quota_test EXIT + set_ost_qtype "none" || error "disable ost quota failed" test_quota_performance $MB set_ost_qtype "ug" || error "enable ost quota failed" - $LFS setquota -u $TSTUSR -b 0 -B 10G -i 0 -I 0 $DIR + $LFS setquota -u $TSTUSR -b 0 -B 10G -i 0 -I 0 $DIR || + error "set quota failed" test_quota_performance $MB cleanup_quota_test @@ -382,7 +404,8 @@ test_1() { # test for user log "User quota (block hardlimit:$LIMIT MB)" - $LFS setquota -u $TSTUSR -b 0 -B ${LIMIT}M -i 0 -I 0 $DIR + $LFS setquota -u $TSTUSR -b 0 -B ${LIMIT}M -i 0 -I 0 $DIR || + error "set user quota failed" # make sure the system is clean local USED=$(getquota -u $TSTUSR global curspace) @@ -413,7 +436,8 @@ test_1() { # test for group log "--------------------------------------" log "Group quota (block hardlimit:$LIMIT MB)" - $LFS setquota -g $TSTUSR -b 0 -B ${LIMIT}M -i 0 -I 0 $DIR + $LFS setquota -g $TSTUSR -b 0 -B ${LIMIT}M -i 0 -I 0 $DIR || + error "set group quota failed" TESTFILE="$DIR/$tdir/$tfile-1" # make sure the system is clean @@ -451,6 +475,11 @@ test_2() { [ "$SLOW" = "no" ] && LIMIT=1024 # 1k inodes + local FREE_INODES=$(lfs_df -i | grep "summary" | awk '{print $4}') + [ $FREE_INODES -lt $LIMIT ] && + skip "not enough free inodes $FREE_INODES required $LIMIT" && + return + setup_quota_test trap cleanup_quota_test EXIT @@ -459,7 +488,8 @@ test_2() { # test for user log "User quota (inode hardlimit:$LIMIT files)" - $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I $LIMIT $DIR + $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I $LIMIT $DIR || + error "set user quota failed" # make sure the system is clean local USED=$(getquota -u $TSTUSR global curinodes) @@ -485,7 +515,8 @@ test_2() { # test for group log "--------------------------------------" log "Group quota (inode hardlimit:$LIMIT files)" - $LFS setquota -g $TSTUSR -b 0 -B 0 -i 0 -I $LIMIT $DIR + $LFS setquota -g $TSTUSR -b 0 -B 0 -i 0 -I $LIMIT $DIR || + error "set group quota failed" TESTFILE=$DIR/$tdir/$tfile-1 # make sure the system is clean @@ -602,8 +633,10 @@ test_3() { local USED=$(getquota -u $TSTUSR global curspace) [ $USED -ne 0 ] && error "Used space($USED) for user $TSTUSR isn't 0." - $LFS setquota -t -u --block-grace $GRACE --inode-grace $MAX_IQ_TIME $DIR - $LFS setquota -u $TSTUSR -b ${LIMIT}M -B 0 -i 0 -I 0 $DIR + $LFS setquota -t -u --block-grace $GRACE --inode-grace \ + $MAX_IQ_TIME $DIR || error "set user grace time failed" + $LFS setquota -u $TSTUSR -b ${LIMIT}M -B 0 -i 0 -I 0 $DIR || + error "set user quota failed" test_block_soft $TESTFILE $GRACE $LIMIT resetquota -u $TSTUSR @@ -614,17 +647,19 @@ test_3() { USED=$(getquota -g $TSTUSR global curspace) [ $USED -ne 0 ] && error "Used space($USED) for group $TSTUSR isn't 0." - $LFS setquota -t -g --block-grace $GRACE --inode-grace $MAX_IQ_TIME $DIR - $LFS setquota -g $TSTUSR -b ${LIMIT}M -B 0 -i 0 -I 0 $DIR + $LFS setquota -t -g --block-grace $GRACE --inode-grace \ + $MAX_IQ_TIME $DIR || error "set group grace time failed" + $LFS setquota -g $TSTUSR -b ${LIMIT}M -B 0 -i 0 -I 0 $DIR || + error "set group quota failed" test_block_soft $TESTFILE $GRACE $LIMIT resetquota -g $TSTUSR # cleanup $LFS setquota -t -u --block-grace $MAX_DQ_TIME --inode-grace \ - $MAX_IQ_TIME $DIR + $MAX_IQ_TIME $DIR || error "restore user grace time failed" $LFS setquota -t -g --block-grace $MAX_DQ_TIME --inode-grace \ - $MAX_IQ_TIME $DIR + $MAX_IQ_TIME $DIR || error "restore group grace time failed" } run_test 3 "Block soft limit (start timer, timer goes off, stop timer)" @@ -698,8 +733,10 @@ test_4a() { local USED=$(getquota -u $TSTUSR global curinodes) [ $USED -ne 0 ] && error "Used space($USED) for user $TSTUSR isn't 0." - $LFS setquota -t -u --block-grace $MAX_DQ_TIME --inode-grace $GRACE $DIR - $LFS setquota -u $TSTUSR -b 0 -B 0 -i $LIMIT -I 0 $DIR + $LFS setquota -t -u --block-grace $MAX_DQ_TIME --inode-grace \ + $GRACE $DIR || error "set user grace time failed" + $LFS setquota -u $TSTUSR -b 0 -B 0 -i $LIMIT -I 0 $DIR || + error "set user quota failed" test_file_soft $TESTFILE $LIMIT $GRACE resetquota -u $TSTUSR @@ -709,8 +746,10 @@ test_4a() { USED=$(getquota -g $TSTUSR global curinodes) [ $USED -ne 0 ] && error "Used space($USED) for group $TSTUSR isn't 0." - $LFS setquota -t -g --block-grace $MAX_DQ_TIME --inode-grace $GRACE $DIR - $LFS setquota -g $TSTUSR -b 0 -B 0 -i $LIMIT -I 0 $DIR + $LFS setquota -t -g --block-grace $MAX_DQ_TIME --inode-grace \ + $GRACE $DIR || error "set group grace time failed" + $LFS setquota -g $TSTUSR -b 0 -B 0 -i $LIMIT -I 0 $DIR || + error "set group quota failed" TESTFILE=$DIR/$tdir/$tfile-1 test_file_soft $TESTFILE $LIMIT $GRACE @@ -718,9 +757,9 @@ test_4a() { # cleanup $LFS setquota -t -u --block-grace $MAX_DQ_TIME --inode-grace \ - $MAX_IQ_TIME $DIR + $MAX_IQ_TIME $DIR || error "restore user grace time failed" $LFS setquota -t -g --block-grace $MAX_DQ_TIME --inode-grace \ - $MAX_IQ_TIME $DIR + $MAX_IQ_TIME $DIR || error "restore group grace time failed" } run_test 4a "File soft limit (start timer, timer goes off, stop timer)" @@ -736,9 +775,11 @@ test_4b() { # test of valid grace strings handling echo "Valid grace strings test" - $LFS setquota -t -u --block-grace $GR_STR1 --inode-grace $GR_STR2 $DIR + $LFS setquota -t -u --block-grace $GR_STR1 --inode-grace \ + $GR_STR2 $DIR || error "set user grace time failed" $LFS quota -u -t $DIR | grep "Block grace time: $GR_STR1" - $LFS setquota -t -g --block-grace $GR_STR3 --inode-grace $GR_STR4 $DIR + $LFS setquota -t -g --block-grace $GR_STR3 --inode-grace \ + $GR_STR4 $DIR || error "set group grace time quota failed" $LFS quota -g -t $DIR | grep "Inode grace time: $GR_STR4" # test of invalid grace strings handling @@ -748,9 +789,9 @@ test_4b() { # cleanup $LFS setquota -t -u --block-grace $MAX_DQ_TIME --inode-grace \ - $MAX_IQ_TIME $DIR + $MAX_IQ_TIME $DIR || error "restore user grace time failed" $LFS setquota -t -g --block-grace $MAX_DQ_TIME --inode-grace \ - $MAX_IQ_TIME $DIR + $MAX_IQ_TIME $DIR || error "restore group grace time failed" } run_test 4b "Grace time strings handling" @@ -766,8 +807,10 @@ test_5() { set_ost_qtype "ug" || error "enable ost quota failed" echo "Set quota limit (0 ${BLIMIT}M 0 $ILIMIT) for $TSTUSR.$TSTUSR" - $LFS setquota -u $TSTUSR -b 0 -B ${BLIMIT}M -i 0 -I $ILIMIT $DIR - $LFS setquota -g $TSTUSR -b 0 -B ${BLIMIT}M -i 0 -I $ILIMIT $DIR + $LFS setquota -u $TSTUSR -b 0 -B ${BLIMIT}M -i 0 -I $ILIMIT $DIR || + error "set user quota failed" + $LFS setquota -g $TSTUSR -b 0 -B ${BLIMIT}M -i 0 -I $ILIMIT $DIR || + error "set group quota failed" # make sure the system is clean local USED=$(getquota -u $TSTUSR global curinodes) @@ -826,7 +869,8 @@ test_6() { chown $TSTUSR2.$TSTUSR2 $TESTFILE2 # cache per-ID lock for $TSTUSR on slave - $LFS setquota -u $TSTUSR -b 0 -B ${LIMIT}M -i 0 -I 0 $DIR + $LFS setquota -u $TSTUSR -b 0 -B ${LIMIT}M -i 0 -I 0 $DIR || + error "set quota failed" $RUNAS $DD of=$TESTFILE count=1 || error "write $TESTFILE failure, expect success" $RUNAS2 $DD of=$TESTFILE2 count=1 || @@ -847,8 +891,9 @@ test_6() { $RUNAS $DD of=$TESTFILE count=$LIMIT seek=1 oflag=sync conv=notrunc & DDPID=$! - echo "Sleep for $TIMEOUT" - sleep $TIMEOUT + # watchdog timer uses a factor of 2 + echo "Sleep for $((TIMEOUT * 2 + 1)) seconds ..." + sleep $((TIMEOUT * 2 + 1)) # write should be blocked and never finished if ! ps -p $DDPID > /dev/null 2>&1; then @@ -920,10 +965,12 @@ test_7a() { echo "Enable quota & set quota limit for $TSTUSR" set_ost_qtype "ug" || error "enable ost quota failed" - $LFS setquota -u $TSTUSR -b 0 -B ${LIMIT}M -i 0 -I 0 $DIR + $LFS setquota -u $TSTUSR -b 0 -B ${LIMIT}M -i 0 -I 0 $DIR || + error "set quota failed" echo "Start ost1..." start ost1 $(ostdevname 1) $OST_MOUNT_OPTS + quota_init wait_ost_reint "ug" || error "reintegration failed" @@ -932,6 +979,27 @@ test_7a() { $RUNAS $DD of=$TESTFILE count=$((LIMIT + 1)) oflag=sync && quota_error u $TSTUSR "write success, but expect EDQUOT" + rm -f $TESTFILE + wait_delete_completed + sync_all_data || true + sleep 3 + + echo "Stop ost1..." + stop ost1 + + $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR || + error "clear quota failed" + + echo "Start ost1..." + start ost1 $(ostdevname 1) $OST_MOUNT_OPTS + quota_init + + wait_ost_reint "ug" || error "reintegration failed" + + # hardlimit should be cleared on slave during reintegration + $RUNAS $DD of=$TESTFILE count=$((LIMIT + 1)) oflag=sync || + quota_error u $TSTUSR "write error, but expect success" + cleanup_quota_test resetquota -u $TSTUSR } @@ -972,7 +1040,8 @@ test_7b() { lustre_fail mds 0xa02 set_ost_qtype "ug" || error "enable ost quota failed" - $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR + $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR || + error "set quota failed" # ignore the write error $RUNAS $DD of=$TESTFILE count=1 seek=1 oflag=sync conv=notrunc @@ -984,6 +1053,7 @@ test_7b() { echo "Restart ost to trigger reintegration..." stop ost1 start ost1 $(ostdevname 1) $OST_MOUNT_OPTS + quota_init wait_ost_reint "ug" || error "reintegration failed" @@ -1011,13 +1081,18 @@ test_7c() { [ $USED -ne 0 ] && error "Used space($USED) for user $TSTUSR isn't 0." set_ost_qtype "none" || error "disable ost quota failed" - $LFS setquota -u $TSTUSR -b 0 -B ${LIMIT}M -i 0 -I 0 $DIR + $LFS setquota -u $TSTUSR -b 0 -B ${LIMIT}M -i 0 -I 0 $DIR || + error "set quota failed" # define OBD_FAIL_QUOTA_DELAY_REINT 0xa03 lustre_fail ost 0xa03 - # enable ost quota to trigger reintegration + # enable ost quota set_ost_qtype "ug" || error "enable ost quota failed" + # trigger reintegration + local procf="osd-$(facet_fstype ost1).$FSNAME-OST*." + procf=${procf}quota_slave.force_reint + $LCTL set_param $procf=1 || "force reintegration failed" echo "Stop mds..." stop mds1 @@ -1026,8 +1101,11 @@ test_7c() { echo "Start mds..." start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS + quota_init - wait_ost_reint "ug" || error "reintegration failed" + # wait longer than usual to make sure the reintegration + # is triggered by quota wb thread. + wait_ost_reint "ug" 200 || error "reintegration failed" # hardlimit should have been fetched by slave during global # reintegration, write will exceed quota @@ -1039,6 +1117,120 @@ test_7c() { } run_test 7c "Quota reintegration (restart mds during reintegration)" +# Quota reintegration (Transfer index in multiple bulks) +test_7d(){ + local TESTFILE=$DIR/$tdir/$tfile + local TESTFILE1="$DIR/$tdir/$tfile"-1 + local limit=20 #20M + + setup_quota_test + trap cleanup_quota_test EXIT + + set_ost_qtype "none" || error "disable ost quota failed" + $LFS setquota -u $TSTUSR -B ${limit}M $DIR || + error "set quota for $TSTUSR failed" + $LFS setquota -u $TSTUSR2 -B ${limit}M $DIR || + error "set quota for $TSTUSR2 failed" + + #define OBD_FAIL_OBD_IDX_READ_BREAK 0x608 + lustre_fail mds 0x608 0 + + # enable quota to tirgger reintegration + set_ost_qtype "u" || error "enable ost quota failed" + wait_ost_reint "u" || error "reintegration failed" + + lustre_fail mds 0 + + # hardlimit should have been fetched by slave during global + # reintegration, write will exceed quota + $RUNAS $DD of=$TESTFILE count=$((limit + 1)) oflag=sync && + quota_error u $TSTUSR "$TSTUSR write success, expect EDQUOT" + + $RUNAS2 $DD of=$TESTFILE1 count=$((limit + 1)) oflag=sync && + quota_error u $TSTUSR2 "$TSTUSR2 write success, expect EDQUOT" + + cleanup_quota_test + resetquota -u $TSTUSR + resetquota -u $TSTUSR2 +} +run_test 7d "Quota reintegration (Transfer index in multiple bulks)" + +# quota reintegration (inode limits) +test_7e() { + [ "$MDSCOUNT" -lt "2" ] && skip "Required more MDTs" && return + + local ilimit=$((1024 * 2)) # 2k inodes + local TESTFILE=$DIR/${tdir}-1/$tfile + + setup_quota_test + trap cleanup_quota_test EXIT + + # make sure the system is clean + local USED=$(getquota -u $TSTUSR global curinodes) + [ $USED -ne 0 ] && error "Used inode($USED) for user $TSTUSR isn't 0." + + # make sure no granted quota on mdt1 + set_mdt_qtype "ug" || error "enable mdt quota failed" + resetquota -u $TSTUSR + set_mdt_qtype "none" || error "disable mdt quota failed" + + local MDTUUID=$(mdtuuid_from_index $((MDSCOUNT - 1))) + USED=$(getquota -u $TSTUSR $MDTUUID ihardlimit) + [ $USED -ne 0 ] && error "limit($USED) on $MDTUUID for user" \ + "$TSTUSR isn't 0." + + echo "Stop mds${MDSCOUNT}..." + stop mds${MDSCOUNT} + + echo "Enable quota & set quota limit for $TSTUSR" + set_mdt_qtype "ug" || error "enable mdt quota failed" + $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I $ilimit $DIR || + error "set quota failed" + + echo "Start mds${MDSCOUNT}..." + start mds${MDSCOUNT} $(mdsdevname $MDSCOUNT) $MDS_MOUNT_OPTS + quota_init + + wait_mdt_reint "ug" || error "reintegration failed" + + echo "create remote dir" + $LFS mkdir -i $((MDSCOUNT - 1)) $DIR/${tdir}-1 || + error "create remote dir failed" + chmod 0777 $DIR/${tdir}-1 + + # hardlimit should have been fetched by slave during global + # reintegration, create will exceed quota + $RUNAS createmany -m $TESTFILE $((ilimit + 1)) && + quota_error u $TSTUSR "create succeeded, expect EDQUOT" + + $RUNAS unlinkmany $TESTFILE $ilimit || "unlink files failed" + wait_delete_completed + sync_all_data || true + + echo "Stop mds${MDSCOUNT}..." + stop mds${MDSCOUNT} + + $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR || + error "clear quota failed" + + echo "Start mds${MDSCOUNT}..." + start mds${MDSCOUNT} $(mdsdevname $MDSCOUNT) $MDS_MOUNT_OPTS + quota_init + + wait_mdt_reint "ug" || error "reintegration failed" + + # hardlimit should be cleared on slave during reintegration + $RUNAS createmany -m $TESTFILE $((ilimit + 1)) || + quota_error -u $TSTUSR "create failed, expect success" + + $RUNAS unlinkmany $TESTFILE $((ilimit + 1)) || "unlink failed" + $LFS rmdir $DIR/${tdir}-1 || "unlink remote dir failed" + + cleanup_quota_test + resetquota -u $TSTUSR +} +run_test 7e "Quota reintegration (inode limits)" + # run dbench with quota enabled test_8() { local BLK_LIMIT="100g" #100G @@ -1051,9 +1243,11 @@ test_8() { set_ost_qtype "ug" || error "enable ost quota failed" echo "Set enough high limit for user: $TSTUSR" - $LFS setquota -u $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR + $LFS setquota -u $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR || + error "set user quota failed" echo "Set enough high limit for group: $TSTUSR" - $LFS setquota -g $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR + $LFS setquota -g $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR || + error "set group quota failed" local duration="" [ "$SLOW" = "no" ] && duration=" -t 120" @@ -1082,7 +1276,7 @@ check_whether_skip () { # run for fixing bug10707, it needs a big room. test for 64bit test_9() { - local filesize=$((1024 * 1024 * 1024 * 9 / 2)) # 4.5G + local filesize=$((1024 * 9 / 2)) # 4.5G check_whether_skip && return 0 @@ -1099,11 +1293,13 @@ test_9() { log "Set enough high limit(block:$BLK_LIMIT; file: $FILE_LIMIT)" \ "for user: $TSTUSR" - $LFS setquota -u $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR + $LFS setquota -u $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR || + error "set user quota failed" log "Set enough high limit(block:$BLK_LIMIT; file: $FILE_LIMIT)" \ "for group: $TSTUSR" - $LFS setquota -g $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR + $LFS setquota -g $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR || + error "set group quota failed" quota_show_check a u $TSTUSR quota_show_check a g $TSTUSR @@ -1143,7 +1339,8 @@ test_10() { # root user can overrun quota set_ost_qtype "ug" || "enable ost quota failed" - $LFS setquota -u $TSTUSR -b 0 -B 2M -i 0 -I 0 $DIR + $LFS setquota -u $TSTUSR -b 0 -B 2M -i 0 -I 0 $DIR || + error "set quota failed" quota_show_check b u $TSTUSR $LFS setstripe $TESTFILE -c 1 @@ -1163,7 +1360,8 @@ test_11() { trap cleanup_quota_test EXIT set_mdt_qtype "ug" || "enable mdt quota failed" - $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 1 $DIR + $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 1 $DIR || + error "set quota failed" touch "$TESTFILE"-0 touch "$TESTFILE"-1 @@ -1180,7 +1378,7 @@ test_11() { } run_test 11 "Chown/chgrp ignores quota" -test_12() { +test_12a() { [ "$OSTCOUNT" -lt "2" ] && skip "skipping rebalancing test" && return local blimit=22 # 22M @@ -1194,7 +1392,8 @@ test_12() { set_ost_qtype "u" || "enable ost quota failed" quota_show_check b u $TSTUSR - $LFS setquota -u $TSTUSR -b 0 -B "$blimit"M -i 0 -I 0 $DIR + $LFS setquota -u $TSTUSR -b 0 -B "$blimit"M -i 0 -I 0 $DIR || + error "set quota failed" $LFS setstripe $TESTFILE0 -c 1 -i 0 $LFS setstripe $TESTFILE1 -c 1 -i 1 @@ -1221,7 +1420,52 @@ test_12() { cleanup_quota_test resetquota -u $TSTUSR } -run_test 12 "Block quota rebalancing" +run_test 12a "Block quota rebalancing" + +test_12b() { + [ "$MDSCOUNT" -lt "2" ] && skip "skipping rebalancing test" && return + + local ilimit=$((1024 * 2)) # 2k inodes + local TESTFILE0=$DIR/$tdir/$tfile + local TESTFILE1=$DIR/${tdir}-1/$tfile + + setup_quota_test + trap cleanup_quota_test EXIT + + $LFS mkdir -i 1 $DIR/${tdir}-1 || error "create remote dir failed" + chmod 0777 $DIR/${tdir}-1 + + set_mdt_qtype "u" || "enable mdt quota failed" + quota_show_check f u $TSTUSR + + $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I $ilimit $DIR || + error "set quota failed" + + echo "Create $ilimit files on mdt0..." + $RUNAS createmany -m $TESTFILE0 $ilimit || + quota_error u $TSTUSR "create failed, but expect success" + + echo "Create files on mdt1..." + $RUNAS createmany -m $TESTFILE1 1 && + quota_error a $TSTUSR "create succeeded, expect EDQUOT" + + echo "Free space from mdt0..." + $RUNAS unlinkmany $TESTFILE0 $ilimit || error "unlink mdt0 files failed" + wait_delete_completed + sync_all_data || true + + echo "Create files on mdt1 after space freed from mdt0..." + $RUNAS createmany -m $TESTFILE1 $((ilimit / 2)) || + quota_error a $TSTUSR "rebalancing failed" + + $RUNAS unlinkmany $TESTFILE1 $((ilimit / 2)) || + error "unlink mdt1 files failed" + $LFS rmdir $DIR/${tdir}-1 || error "unlink remote dir failed" + + cleanup_quota_test + resetquota -u $TSTUSR +} +run_test 12b "Inode quota rebalancing" test_13(){ local TESTFILE=$DIR/$tdir/$tfile @@ -1234,7 +1478,8 @@ test_13(){ set_ost_qtype "u" || "enable ost quota failed" quota_show_check b u $TSTUSR - $LFS setquota -u $TSTUSR -b 0 -B 10M -i 0 -I 0 $DIR + $LFS setquota -u $TSTUSR -b 0 -B 10M -i 0 -I 0 $DIR || + error "set quota failed" $LFS setstripe $TESTFILE -c 1 -i 0 chown $TSTUSR.$TSTUSR $TESTFILE @@ -1278,14 +1523,16 @@ test_15(){ sync_all_data || true # test for user - $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR + $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR || + error "set user quota failed" local TOTAL_LIMIT=$(getquota -u $TSTUSR global bhardlimit) [ $TOTAL_LIMIT -eq $LIMIT ] || error "(user) limit:$TOTAL_LIMIT, expect:$LIMIT, failed!" resetquota -u $TSTUSR # test for group - $LFS setquota -g $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR + $LFS setquota -g $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR || + error "set group quota failed" TOTAL_LIMIT=$(getquota -g $TSTUSR global bhardlimit) [ $TOTAL_LIMIT -eq $LIMIT ] || error "(group) limits:$TOTAL_LIMIT, expect:$LIMIT, failed!" @@ -1308,7 +1555,8 @@ test_17sub() { set_ost_qtype "ug" || error "enable ost quota failed" # make sure no granted quota on ost resetquota -u $TSTUSR - $LFS setquota -u $TSTUSR -b 0 -B 10M -i 0 -I 0 $DIR + $LFS setquota -u $TSTUSR -b 0 -B 10M -i 0 -I 0 $DIR || + error "set quota failed" quota_show_check b u $TSTUSR @@ -1380,7 +1628,8 @@ test_18_sub () { set_ost_qtype "u" || error "enable ost quota failed" log "User quota (limit: $blimit)" - $LFS setquota -u $TSTUSR -b 0 -B $blimit -i 0 -I 0 $MOUNT + $LFS setquota -u $TSTUSR -b 0 -B $blimit -i 0 -I 0 $MOUNT || + error "set quota failed" quota_show_check b u $TSTUSR $LFS setstripe $TESTFILE -i 0 -c 1 @@ -1439,7 +1688,7 @@ test_18() { # check if watchdog is triggered do_facet ost1 dmesg > $TMP/lustre-log-${TESTNAME}.log - local watchdog=$(awk '/test 18b/ {start = 1;} + local watchdog=$(awk '/sanity-quota test 18/ {start = 1;} /Service thread pid/ && /was inactive/ { if (start) { print; @@ -1464,10 +1713,12 @@ test_19() { chown $TSTUSR.$TSTUSR $TESTFILE echo "Set user quota (limit: "$blimit"M)" - $LFS setquota -u $TSTUSR -b 0 -B "$blimit"M -i 0 -I 0 $MOUNT + $LFS setquota -u $TSTUSR -b 0 -B "$blimit"M -i 0 -I 0 $MOUNT || + error "set user quota failed" quota_show_check b u $TSTUSR echo "Update quota limits" - $LFS setquota -u $TSTUSR -b 0 -B "$blimit"M -i 0 -I 0 $MOUNT + $LFS setquota -u $TSTUSR -b 0 -B "$blimit"M -i 0 -I 0 $MOUNT || + error "set group quota failed" quota_show_check b u $TSTUSR # first wirte might be cached @@ -1534,9 +1785,11 @@ test_21() { set_ost_qtype "ug" || error "Enable ost quota failed" log "Set limit(block:${BLIMIT}G; file:$ILIMIT) for user: $TSTUSR" - $LFS setquota -u $TSTUSR -b 0 -B ${BLIMIT}G -i 0 -I $ILIMIT $MOUNT + $LFS setquota -u $TSTUSR -b 0 -B ${BLIMIT}G -i 0 -I $ILIMIT $MOUNT || + error "set user quota failed" log "Set limit(block:${BLIMIT}G; file:$ILIMIT) for group: $TSTUSR" - $LFS setquota -g $TSTUSR -b 0 -B $BLIMIT -i 0 -I $ILIMIT $MOUNT + $LFS setquota -g $TSTUSR -b 0 -B $BLIMIT -i 0 -I $ILIMIT $MOUNT || + error "set group quota failed" # repeat writing on a 1M file test_21_sub ${TESTFILE}_1 1 30 & @@ -1612,6 +1865,7 @@ test_22() { stopall mount setupall + quota_init echo "Verify if quota is disabled" qtype=$(mdt_quota_type) @@ -1619,7 +1873,7 @@ test_22() { qtype=$(ost_quota_type) [ $qtype != "none" ] && error "ost quota setting is lost" - quota_init + return 0 } run_test 22 "enable/disable quota by 'lctl conf_param'" @@ -1634,7 +1888,8 @@ test_23_sub() { # test for user log "User quota (limit: $LIMIT MB)" - $LFS setquota -u $TSTUSR -b 0 -B "$LIMIT"M -i 0 -I 0 $DIR + $LFS setquota -u $TSTUSR -b 0 -B "$LIMIT"M -i 0 -I 0 $DIR || + error "set quota failed" quota_show_check b u $TSTUSR $LFS setstripe $TESTFILE -c 1 -i 0 @@ -1696,7 +1951,8 @@ test_24() { chown $TSTUSR.$TSTUSR $TESTFILE echo "Set user quota (limit: "$blimit"M)" - $LFS setquota -u $TSTUSR -b 0 -B "$blimit"M -i 0 -I 0 $MOUNT + $LFS setquota -u $TSTUSR -b 0 -B "$blimit"M -i 0 -I 0 $MOUNT || + error "set quota failed" # overrun quota by root user runas -u 0 -g 0 $DD of=$TESTFILE count=$((blimit + 1)) || @@ -1747,12 +2003,14 @@ test_30() { $LFS setstripe $TESTFILE -i 0 -c 1 chown $TSTUSR.$TSTUSR $TESTFILE - $LFS setquota -t -u --block-grace $GRACE --inode-grace $MAX_IQ_TIME $DIR - $LFS setquota -u $TSTUSR -b ${LIMIT}M -B 0 -i 0 -I 0 $DIR + $LFS setquota -t -u --block-grace $GRACE --inode-grace \ + $MAX_IQ_TIME $DIR || error "set grace time failed" + $LFS setquota -u $TSTUSR -b ${LIMIT}M -B 0 -i 0 -I 0 $DIR || + error "set quota failed" $RUNAS $DD of=$TESTFILE count=$((LIMIT * 2)) || true cancel_lru_locks osc sleep $GRACE - $LFS setquota -u $TSTUSR -B 0 $DIR + $LFS setquota -u $TSTUSR -B 0 $DIR || error "clear quota failed" # over-quota flag has not yet settled since we do not trigger async # events based on grace time period expiration $SHOW_QUOTA_USER @@ -1766,7 +2024,7 @@ test_30() { cleanup_quota_test resetquota -u $TSTUSR $LFS setquota -t -u --block-grace $MAX_DQ_TIME --inode-grace \ - $MAX_IQ_TIME $DIR + $MAX_IQ_TIME $DIR || error "restore grace time failed" } run_test 30 "Hard limit updates should not reset grace times" @@ -1990,7 +2248,7 @@ test_36() { local proc="qmt.*.md-0x0.glb-usr" id_cnt=$(do_node $mdt0_node $LCTL get_param -n $proc | wc -l) - [ $id_cnt -eq 401 ] || error "Migrate inode user limit failed: $id_cnt" + [ $id_cnt -eq 403 ] || error "Migrate inode user limit failed: $id_cnt" limit=$(getquota -u 1 global isoftlimit) [ $limit -eq 1024 ] || error "User inode softlimit: $limit" limit=$(getquota -u 1 global ihardlimit) @@ -1998,7 +2256,7 @@ test_36() { proc="qmt.*.md-0x0.glb-grp" id_cnt=$(do_node $mdt0_node $LCTL get_param -n $proc | wc -l) - [ $id_cnt -eq 401 ] || error "Migrate inode group limit failed: $id_cnt" + [ $id_cnt -eq 403 ] || error "Migrate inode group limit failed: $id_cnt" limit=$(getquota -g 1 global isoftlimit) [ $limit -eq 1024 ] || error "Group inode softlimit: $limit" limit=$(getquota -g 1 global ihardlimit) @@ -2006,7 +2264,7 @@ test_36() { proc=" qmt.*.dt-0x0.glb-usr" id_cnt=$(do_node $mdt0_node $LCTL get_param -n $proc | wc -l) - [ $id_cnt -eq 401 ] || error "Migrate block user limit failed: $id_cnt" + [ $id_cnt -eq 403 ] || error "Migrate block user limit failed: $id_cnt" limit=$(getquota -u 60001 global bsoftlimit) [ $limit -eq 10485760 ] || error "User block softlimit: $limit" limit=$(getquota -u 60001 global bhardlimit) @@ -2014,7 +2272,7 @@ test_36() { proc="qmt.*.dt-0x0.glb-grp" id_cnt=$(do_node $mdt0_node $LCTL get_param -n $proc | wc -l) - [ $id_cnt -eq 401 ] || error "Migrate block user limit failed: $id_cnt" + [ $id_cnt -eq 403 ] || error "Migrate block user limit failed: $id_cnt" limit=$(getquota -g 60001 global bsoftlimit) [ $limit -eq 10485760 ] || error "Group block softlimit: $limit" limit=$(getquota -g 60001 global bhardlimit)