X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity-quota.sh;h=f8d741351974e3a934aab04d66878a3c26c3f3b9;hb=10ebe81e394af356fbae4703ca47586d6b3bc367;hp=68d6eda7ba5cf0f5022d657cabc544ef17eb840c;hpb=1bdf0d6fcbe11efdf67ebdb09f04955b9ce88de4;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity-quota.sh b/lustre/tests/sanity-quota.sh index 68d6eda..f8d7413 100644 --- a/lustre/tests/sanity-quota.sh +++ b/lustre/tests/sanity-quota.sh @@ -43,13 +43,23 @@ if [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.50) ]; then exec $LUSTRE/tests/sanity-quota-old.sh fi -# if e2fsprogs support quota feature? -if [ $(facet_fstype $SINGLEMDS) == ldiskfs ] && \ - ! $DEBUGFS -c -R supported_features | grep -q 'quota'; then +# Does e2fsprogs support quota feature? +if [ $(facet_fstype $SINGLEMDS) == ldiskfs ] && + do_facet $SINGLEMDS "! $DEBUGFS -c -R supported_features | + grep -q 'quota'"; then skip "e2fsprogs doesn't support quota" && exit 0 fi -[ "$SLOW" = "no" ] && EXCEPT_SLOW="9 18 21" +if [ $(facet_fstype $SINGLEMDS) = "zfs" ]; then +# bug number for skipped test: LU-2836 LU-6836 LU-2836 LU-2059 + ALWAYS_EXCEPT="$ALWAYS_EXCEPT 3 4a 6 7d" +# bug number for skipped test: LU-5638 + ALWAYS_EXCEPT="$ALWAYS_EXCEPT 11 33 34 35" +# bug number: LU-2887 + ZFS_SLOW="12a" +fi + +[ "$SLOW" = "no" ] && EXCEPT_SLOW="$ZFS_SLOW 9 18 21" QUOTALOG=${TESTSUITELOG:-$TMP/$(basename $0 .sh).log} @@ -78,21 +88,18 @@ SHOW_QUOTA_INFO_GROUP="$LFS quota -t -g $DIR" build_test_filter lustre_fail() { - local fail_node=$1 + local fail_node=$1 local fail_loc=$2 local fail_val=${3:-0} + local NODES= - if [ $fail_node == "mds" ] || [ $fail_node == "mds_ost" ]; then - do_facet $SINGLEMDS "lctl set_param fail_val=$fail_val" - do_facet $SINGLEMDS "lctl set_param fail_loc=$fail_loc" - fi + case $fail_node in + mds_ost|mdt_ost) NODES="$(comma_list $(mdts_nodes) $(osts_nodes))";; + mds|mdt) NODES="$(comma_list $(mdts_nodes))";; + ost) NODES="$(comma_list $(osts_nodes))";; + esac - if [ $fail_node == "ost" ] || [ $fail_node == "mds_ost" ]; then - for num in `seq $OSTCOUNT`; do - do_facet ost$num "lctl set_param fail_val=$fail_val" - do_facet ost$num "lctl set_param fail_loc=$fail_loc" - done - fi + do_nodes $NODES "lctl set_param fail_val=$fail_val fail_loc=$fail_loc" } RUNAS="runas -u $TSTID -g $TSTID" @@ -133,7 +140,7 @@ quota_scan() { fi if [ "$LOCAL_UG" == "a" -o "$LOCAL_UG" == "g" ]; then - $LFS quota -v -u $LOCAL_ID $DIR + $LFS quota -v -g $LOCAL_ID $DIR log "Files for group ($LOCAL_ID):" ($LFS find -group $LOCAL_ID $DIR | head -n 4 | xargs stat 2>/dev/null) @@ -360,8 +367,14 @@ test_quota_performance() { delta=$((etime - stime)) if [ $delta -gt 0 ]; then rate=$((size * 1024 / delta)) - [ $rate -gt 1024 ] || - error "SLOW IO for $TSTUSR (user): $rate KB/sec" + if [ $(facet_fstype $SINGLEMDS) = "zfs" ]; then + # LU-2872 - see LU-2887 for fix + [ $rate -gt 64 ] || + error "SLOW IO for $TSTUSR (user): $rate KB/sec" + else + [ $rate -gt 1024 ] || + error "SLOW IO for $TSTUSR (user): $rate KB/sec" + fi fi rm -f $TESTFILE } @@ -475,7 +488,8 @@ test_2() { [ "$SLOW" = "no" ] && LIMIT=1024 # 1k inodes - local FREE_INODES=$(lfs_df -i | grep "summary" | awk '{print $4}') + local FREE_INODES=$(mdt_free_inodes 0) + echo "$FREE_INODES free inodes on master MDT" [ $FREE_INODES -lt $LIMIT ] && skip "not enough free inodes $FREE_INODES required $LIMIT" && return @@ -623,7 +637,7 @@ test_block_soft() { # block soft limit test_3() { local LIMIT=1 # 1MB - local GRACE=10 # 10s + local GRACE=20 # 20s local TESTFILE=$DIR/$tdir/$tfile-0 set_ost_qtype "ug" || error "enable ost quota failed" @@ -666,7 +680,8 @@ run_test 3 "Block soft limit (start timer, timer goes off, stop timer)" test_file_soft() { local TESTFILE=$1 local LIMIT=$2 - local TIMER=$(($3 * 3 / 2)) + local grace=$3 + local TIMER=$(($grace * 3 / 2)) setup_quota_test trap cleanup_quota_test EXIT @@ -674,13 +689,19 @@ test_file_soft() { echo "Create files to exceed soft limit" $RUNAS createmany -m ${TESTFILE}_ $((LIMIT + 1)) || quota_error a $TSTUSR "create failure, but expect success" - sync; sleep 1; sync + local trigger_time=$(date +%s) + + sync_all_data || true + + local cur_time=$(date +%s) + [ $(($cur_time - $trigger_time)) -ge $grace ] && + error "Passed grace time $grace, $trigger_time, $cur_time" echo "Create file before timer goes off" $RUNAS touch ${TESTFILE}_before || quota_error a $TSTUSR "failed create before timer expired," \ - "but expect success" - sync; sleep 1; sync + "but expect success. $trigger_time, $cur_time" + sync_all_data || true echo "Sleep $TIMER seconds ..." sleep $TIMER @@ -695,11 +716,11 @@ test_file_soft() { # hasn't been decreased from the pending write, if we acquire quota # in this window, we'll acquire more than we needed. $RUNAS touch ${TESTFILE}_after_1 ${TESTFILE}_after_2 || true - sync; sleep 1; sync + sync_all_data || true $RUNAS touch ${TESTFILE}_after_3 && quota_error a $TSTUSR "create after timer expired," \ "but expect EDQUOT" - sync; sleep 1; sync + sync_all_data || true $SHOW_QUOTA_USER $SHOW_QUOTA_GROUP @@ -714,7 +735,7 @@ test_file_soft() { $RUNAS touch ${TESTFILE}_xxx || quota_error a $TSTUSR "touch after timer stop failure," \ "but expect success" - sync; sleep 1; sync + sync_all_data || true # cleanup cleanup_quota_test @@ -724,7 +745,7 @@ test_file_soft() { test_4a() { local LIMIT=10 # inodes local TESTFILE=$DIR/$tdir/$tfile-0 - local GRACE=5 + local GRACE=12 set_mdt_qtype "ug" || error "enable mdt quota failed" @@ -847,6 +868,10 @@ run_test 5 "Chown & chgrp successfully even out of block/file quota" test_6() { local LIMIT=3 # 3M + # Clear dmesg so watchdog is not triggered by previous + # test output + do_facet ost1 dmesg -c > /dev/null + setup_quota_test trap cleanup_quota_test EXIT @@ -905,25 +930,26 @@ test_6() { # no watchdog is triggered do_facet ost1 dmesg > $TMP/lustre-log-${TESTNAME}.log - watchdog=$(awk '/sanity-quota test 6/ {start = 1;} - /Service thread pid/ && /was inactive/ { - if (start) { - print; - } - }' $TMP/lustre-log-${TESTNAME}.log) + watchdog=$(awk '/Service thread pid/ && /was inactive/ \ + { print; }' $TMP/lustre-log-${TESTNAME}.log) [ -z "$watchdog" ] || error "$watchdog" rm -f $TMP/lustre-log-${TESTNAME}.log - # write should continue & succeed + # write should continue then fail with EDQUOT local count=0 + local c_size while [ true ]; do if ! ps -p ${DDPID} > /dev/null 2>&1; then break; fi - if [ $count -ge 120 ]; then + if [ $count -ge 240 ]; then quota_error u $TSTUSR "dd not finished in $count secs" fi count=$((count + 1)) - [ $((count % 10)) -eq 0 ] && echo "Waiting $count secs" + if [ $((count % 30)) -eq 0 ]; then + c_size=$(stat -c %s $TESTFILE) + echo "Waiting $count secs. $c_size" + $SHOW_QUOTA_USER + fi sleep 1 done @@ -1092,7 +1118,8 @@ test_7c() { # trigger reintegration local procf="osd-$(facet_fstype ost1).$FSNAME-OST*." procf=${procf}quota_slave.force_reint - $LCTL set_param $procf=1 || "force reintegration failed" + do_facet ost1 $LCTL set_param $procf=1 || + error "force reintegration failed" echo "Stop mds..." stop mds1 @@ -1224,7 +1251,7 @@ test_7e() { quota_error -u $TSTUSR "create failed, expect success" $RUNAS unlinkmany $TESTFILE $((ilimit + 1)) || "unlink failed" - $LFS rmdir $DIR/${tdir}-1 || "unlink remote dir failed" + rmdir $DIR/${tdir}-1 || "unlink remote dir failed" cleanup_quota_test resetquota -u $TSTUSR @@ -1460,7 +1487,7 @@ test_12b() { $RUNAS unlinkmany $TESTFILE1 $((ilimit / 2)) || error "unlink mdt1 files failed" - $LFS rmdir $DIR/${tdir}-1 || error "unlink remote dir failed" + rmdir $DIR/${tdir}-1 || error "unlink remote dir failed" cleanup_quota_test resetquota -u $TSTUSR @@ -1673,7 +1700,7 @@ test_18_sub () { local testfile_size=$(stat -c %s $TESTFILE) if [ $testfile_size -ne $((BLK_SZ * 1024 * 100)) ] ; then - quota_error u $TSTUSR "expect $((BLK_SZ * 1024 * 100))," + quota_error u $TSTUSR "expect $((BLK_SZ * 1024 * 100))," \ "got ${testfile_size}. Verifying file failed!" fi cleanup_quota_test @@ -1683,17 +1710,17 @@ test_18_sub () { # test when mds does failover, the ost still could work well # this test shouldn't trigger watchdog b=14840 test_18() { + # Clear dmesg so watchdog is not triggered by previous + # test output + do_facet ost1 dmesg -c > /dev/null + test_18_sub normal test_18_sub directio # check if watchdog is triggered do_facet ost1 dmesg > $TMP/lustre-log-${TESTNAME}.log - local watchdog=$(awk '/sanity-quota test 18/ {start = 1;} - /Service thread pid/ && /was inactive/ { - if (start) { - print; - } - }' $TMP/lustre-log-${TESTNAME}.log) + local watchdog=$(awk '/Service thread pid/ && /was inactive/ \ + { print; }' $TMP/lustre-log-${TESTNAME}.log) [ -z "$watchdog" ] || error "$watchdog" rm -f $TMP/lustre-log-${TESTNAME}.log } @@ -1925,6 +1952,10 @@ test_23_sub() { } test_23() { + [ $(facet_fstype ost1) == "zfs" ] && + skip "Overwrite in place is not guaranteed to be " \ + "space neutral on ZFS" && return + local OST0_MIN=$((6 * 1024)) # 6MB, extra space for meta blocks. check_whether_skip && return 0 log "run for 4MB test file" @@ -1989,6 +2020,32 @@ test_27b() { # b20200 } run_test 27b "lfs quota/setquota should handle user/group ID (b20200)" +test_27c() { + local limit + + $LFS setquota -u $TSTID -b 30M -B 3T $DIR || + error "lfs setquota failed" + + limit=$($LFS quota -u $TSTID -v -h $DIR | grep $DIR | awk '{print $3}') + [ $limit != "30M" ] && error "softlimit $limit isn't human-readable" + limit=$($LFS quota -u $TSTID -v -h $DIR | grep $DIR | awk '{print $4}') + [ $limit != "3T" ] && error "hardlimit $limit isn't human-readable" + + $LFS setquota -u $TSTID -b 1500M -B 18500G $DIR || + error "lfs setquota for $TSTID failed" + + limit=$($LFS quota -u $TSTID -v -h $DIR | grep $DIR | awk '{print $3}') + [ $limit != "1.465G" ] && error "wrong softlimit $limit" + limit=$($LFS quota -u $TSTID -v -h $DIR | grep $DIR | awk '{print $4}') + [ $limit != "18.07T" ] && error "wrong hardlimit $limit" + + $LFS quota -u $TSTID -v -h $DIR | grep -q "Total allocated" || + error "total allocated inode/block limit not printed" + + resetquota -u $TSTUSR +} +run_test 27c "lfs quota should support human-readable output" + test_30() { local output local LIMIT=4 # 4MB @@ -2014,11 +2071,11 @@ test_30() { # over-quota flag has not yet settled since we do not trigger async # events based on grace time period expiration $SHOW_QUOTA_USER - $RUNAS $DD of=$TESTFILE conv=notrunc oflag=append count=1 || true + $RUNAS $DD of=$TESTFILE conv=notrunc oflag=append count=4 || true cancel_lru_locks osc # now over-quota flag should be settled and further writes should fail $SHOW_QUOTA_USER - $RUNAS $DD of=$TESTFILE conv=notrunc oflag=append count=1 && + $RUNAS $DD of=$TESTFILE conv=notrunc oflag=append count=4 && error "grace times were reset" # cleanup cleanup_quota_test @@ -2097,6 +2154,9 @@ test_34() { USED=$(getquota -g $TSTID global curspace) [ $USED -ne 0 ] && error "Used space ($USED) for group $TSTID isn't 0." + local USED=$(getquota -u $TSTID2 global curspace) + [ $USED -ne 0 ] && error "Used space ($USED) for user $TSTID2 isn't 0." + echo "Write file..." $DD of=$DIR/$tdir/$tfile count=$BLK_CNT 2>/dev/null || error "write failed" @@ -2133,6 +2193,24 @@ test_34() { [ $USED -eq 1 ] || error "Used inodes for group $TSTID is $USED, expected 1" + # chown won't change the ost object group. LU-4345 */ + echo "chown the file to user $TSTID2" + chown $TSTID2 $DIR/$tdir/$tfile || error "chown to $TSTID2 failed" + + echo "Wait for setattr on objects finished..." + wait_delete_completed + + echo "Verify disk usage for user $TSTID2/$TSTID and group $TSTID" + USED=$(getquota -u $TSTID2 global curspace) + [ $USED -lt $BLK_CNT ] && + error "Used space for user $TSTID2 is $USED, expected $BLK_CNT" + USED=$(getquota -u $TSTID global curspace) + [ $USED -ne 0 ] && + error "Used space for user $TSTID is $USED, expected 0" + USED=$(getquota -g $TSTID global curspace) + [ $USED -lt $BLK_CNT ] && + error "Used space for group $TSTID is $USED, expected $BLK_CNT" + cleanup_quota_test } run_test 34 "Usage transfer for user & group" @@ -2212,77 +2290,35 @@ test_35() { } run_test 35 "Usage is still accessible across reboot" -# test migrating old amdin quota files (in Linux quota file format v2) into new -# quota global index (in IAM format) -test_36() { - [ $(facet_fstype $SINGLEMDS) != ldiskfs ] && \ - skip "skipping migration test" && return - - # get the mdt0 device name - local mdt0_node=$(facet_active_host $SINGLEMDS) - local mdt0_dev=$(mdsdevname ${SINGLEMDS//mds/}) - - echo "Reformat..." - formatall - - echo "Copy admin quota files into MDT0..." - local mntpt=$(facet_mntpt $SINGLEMDS) - local mdt0_fstype=$(facet_fstype $SINGLEMDS) - local opt - if ! do_node $mdt0_node test -b $mdt0_fstype; then - opt="-o loop" - fi - echo "$mdt0_node, $mdt0_dev, $mntpt, $opt" - do_node $mdt0_node mount -t $mdt0_fstype $opt $mdt0_dev $mntpt - do_node $mdt0_node mkdir $mntpt/OBJECTS - do_node $mdt0_node cp $LUSTRE/tests/admin_quotafile_v2.usr $mntpt/OBJECTS - do_node $mdt0_node cp $LUSTRE/tests/admin_quotafile_v2.grp $mntpt/OBJECTS - do_node $mdt0_node umount -f $mntpt - - echo "Setup all..." - setupall +# chown/chgrp to the file created with MDS_OPEN_DELAY_CREATE +# LU-5006 +test_37() { + setup_quota_test + trap cleanup_quota_test EXIT - echo "Verify global limits..." - local id_cnt - local limit + # make sure the system is clean + local USED=$(getquota -u $TSTID global curspace) + [ $USED -ne 0 ] && + error "Used space ($USED) for user $TSTID isn't 0." - local proc="qmt.*.md-0x0.glb-usr" - id_cnt=$(do_node $mdt0_node $LCTL get_param -n $proc | wc -l) - [ $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) - [ $limit -eq 2048 ] || error "User inode hardlimit: $limit" - - proc="qmt.*.md-0x0.glb-grp" - id_cnt=$(do_node $mdt0_node $LCTL get_param -n $proc | wc -l) - [ $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) - [ $limit -eq 2048 ] || error "Group inode hardlimit: $limit" - - proc=" qmt.*.dt-0x0.glb-usr" - id_cnt=$(do_node $mdt0_node $LCTL get_param -n $proc | wc -l) - [ $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) - [ $limit -eq 20971520 ] || error "User block hardlimit: $limit" - - proc="qmt.*.dt-0x0.glb-grp" - id_cnt=$(do_node $mdt0_node $LCTL get_param -n $proc | wc -l) - [ $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) - [ $limit -eq 20971520 ] || error "Group block hardlimit: $limit" - - echo "Cleanup..." - formatall - setupall + # create file with MDS_OPEN_DELAY_CREATE flag + $LFS setstripe -c 1 -i 0 $DIR/$tdir/$tfile || + error "Create file failed" + # write to file + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 conv=notrunc \ + oflag=sync || error "Write file failed" + # chown to the file + chown $TSTID $DIR/$tdir/$tfile || error "Chown to file failed" + + # wait for setattr on objects finished..." + wait_delete_completed + + USED=$(getquota -u $TSTID global curspace) + [ $USED -ne 0 ] || quota_error u $TSTUSR "Used space is 0" + + cleanup_quota_test } -run_test 36 "Migrate old admin files into new global indexes" +run_test 37 "Quota accounted properly for file created by 'lfs setstripe'" quota_fini() {