From: tianzy Date: Sat, 7 Apr 2007 15:12:42 +0000 (+0000) Subject: Some racy problems happened when sanity-quota.sh run on buffalo. X-Git-Tag: v1_7_100~199 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=37ab828e8dc91225c9ed6daf221552266cf524ba;hp=ef266ede9a416d2c1d5189641fcc03ddb095f480 Some racy problems happened when sanity-quota.sh run on buffalo. This patch corrected these bugs. b=12190 --- diff --git a/lustre/tests/sanity-quota.sh b/lustre/tests/sanity-quota.sh index 37b3721..1f2ca61 100644 --- a/lustre/tests/sanity-quota.sh +++ b/lustre/tests/sanity-quota.sh @@ -16,6 +16,14 @@ fi SRCDIR=`dirname $0` export PATH=$PWD/$SRCDIR:$SRCDIR:$PWD/$SRCDIR/../utils:$PATH:/sbin +if [ "$1" == "9_10" ]; then + echo "only run for test9 and test10" + shift + TEST_9_10=1 + ONLY="9 10" +else + TEST_9_10=0 +fi ONLY=${ONLY:-"$*"} ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-""} # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT! @@ -73,10 +81,13 @@ run_one() { } build_test_filter() { + [ "$ALWAYS_EXCEPT$EXCEPT$SANITY_EXCEPT" ] && \ + echo "Skipping tests: `echo $ALWAYS_EXCEPT $EXCEPT $SANITY_QUOTA_EXCEPT`" + for O in $ONLY; do eval ONLY_${O}=true done - for E in $EXCEPT $ALWAYS_EXCEPT; do + for E in $EXCEPT $ALWAYS_EXCEPT $SANITY_QUOTA_EXCEPT; do eval EXCEPT_${E}=true done # turn on/off quota tests must be included @@ -139,7 +150,7 @@ pass() { } mounted_lustre_filesystems() { - awk '($3 ~ "lustre" && $1 ~ ":") { print $2 }' /proc/mounts | sed -n $1p + awk '($3 ~ "lustre" && $1 ~ ":") { print $2 }' /proc/mounts | sed -n ${1}p } # Remember where our caller has hinted that we should mount lustre @@ -147,13 +158,13 @@ MOUNT_HINT=$MOUNT MOUNT_HINT2=$MOUNT2 MOUNT="`mounted_lustre_filesystems 1`" MOUNT2="`mounted_lustre_filesystems 2`" -if [ -n "$MOUNT" -a -z "$MOUNT2" ]; then - error "this test needs two mount point!" -fi -if [ -z "$MOUNT" -a -n "$MOUNT2" ]; then - error "this test needs two mount point!" -fi -if [ -z "$MOUNT" -a -z "$MOUNT2" ]; then +if [ $TEST_9_10 -eq 1 -a "$MOUNT" ]; then + echo "test9 and test10 will run on $MOUNT" +elif [ "$MOUNT" -a "$MOUNT2" ]; then + echo "testing on $MOUNT and $MOUNT2" +elif [ "$MOUNT" -o "$MOUNT2" ]; then + error "test needs two mounts, only found $MOUNT $MOUNT2!" +else export QUOTA_OPTS="quotaon=ug" export MOUNT=$MOUNT_HINT export MOUNT2=$MOUNT_HINT2 @@ -170,17 +181,25 @@ fi DIR=${DIR:-$MOUNT} [ -z "`echo $DIR | grep $MOUNT`" ] && echo "$DIR not in $MOUNT" && exit 99 +DIR2=${DIR2:-$MOUNT2} LPROC=/proc/fs/lustre LOVNAME=`cat $LPROC/llite/*/lov/common_name | tail -n 1` -OSTCOUNT=`cat $LPROC/lov/$LOVNAME/numobd` +if [ $TEST_9_10 -eq 1 ]; then + OSTCOUNT=2 +else + OSTCOUNT=`cat $LPROC/lov/$LOVNAME/numobd` +fi STRIPECOUNT=`cat $LPROC/lov/$LOVNAME/stripecount` STRIPESIZE=`cat $LPROC/lov/$LOVNAME/stripesize` ORIGFREE=`cat $LPROC/lov/$LOVNAME/kbytesavail` MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))} MDS=$(\ls $LPROC/mds 2> /dev/null | grep -v num_refs | tail -n 1) -TSTDIR="$MOUNT/quota_dir" -TSTDIR2="$MOUNT2/quota_dir" +TSTDIR=$DIR/quota_test_dir +TSTDIR2=$DIR2/quota_test_dir +SHOW_QUOTA_USER="$LFS quota -u $TSTUSR $MOUNT" +SHOW_QUOTA_GROUP="$LFS quota -g $TSTUSR $MOUNT" +SHOW_QUOTA_INFO="$LFS quota -t $MOUNT" build_test_filter @@ -188,36 +207,37 @@ build_test_filter # set_blk_tunables(btune_sz) set_blk_tunesz() { # set btune size on all obdfilters - for i in `ls /proc/fs/lustre/obdfilter/*/quota_btune_sz`; do + for i in /proc/fs/lustre/obdfilter/*/quota_btune_sz; do echo $(($1 * $BLK_SZ)) > $i done # set btune size on mds - for i in `ls /proc/fs/lustre/mds/lustre-MDT*/quota_btune_sz`; do + for i in /proc/fs/lustre/mds/lustre-MDT*/quota_btune_sz; do echo $(($1 * $BLK_SZ)) > $i done } -# se_blk_unitsz(bunit_sz) + +# set_blk_unitsz(bunit_sz) set_blk_unitsz() { - for i in `ls /proc/fs/lustre/obdfilter/*/quota_bunit_sz`; do + for i in /proc/fs/lustre/obdfilter/*/quota_bunit_sz; do echo $(($1 * $BLK_SZ)) > $i done - for i in `ls /proc/fs/lustre/mds/lustre-MDT*/quota_bunit_sz`; do + for i in /proc/fs/lustre/mds/lustre-MDT*/quota_bunit_sz; do echo $(($1 * $BLK_SZ)) > $i done } + # set_file_tunesz(itune_sz) set_file_tunesz() { # set iunit and itune size on all obdfilters - for i in `ls /proc/fs/lustre/obdfilter/*/quota_itune_sz`; do + for i in /proc/fs/lustre/obdfilter/*/quota_itune_sz; do echo $1 > $i done # set iunit and itune size on mds - for i in `ls /proc/fs/lustre/mds/lustre-MDT*/quota_itune_sz`; do + for i in /proc/fs/lustre/mds/lustre-MDT*/quota_itune_sz; do echo $1 > $i done - - } + # set_file_unitsz(iunit_sz) set_file_unitsz() { for i in `ls /proc/fs/lustre/obdfilter/*/quota_iunit_sz`; do @@ -243,7 +263,9 @@ pre_test() { set_file_unitsz $IUNIT_SZ fi } -pre_test +if [ $TEST_9_10 -eq 0 ]; then + pre_test +fi post_test() { if [ -z "$NOSETUP" ]; then @@ -286,11 +308,10 @@ setup() { RUNAS2="runas -u $TSTID2" # create test directory - [ -d $TSTDIR ] || mkdir $TSTDIR - chmod 777 $TSTDIR + rm -fr $TSTDIR - [ -d $TSTDIR2 ] || mkdir $TSTDIR2 - chmod 777 $TSTDIR2 + mkdir -p $TSTDIR + chmod 777 $TSTDIR } setup @@ -306,45 +327,45 @@ run_test 0 "Set quota =============================" # block hard limit (normal use and out of quota) test_1() { - LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits each sever + LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 5)) # 5 bunits each sever TESTFILE="$TSTDIR/quota_tst10" - echo " User quota (limit: $LIMIT bytes)" + echo " User quota (limit: $LIMIT kbytes)" $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $MOUNT + $SHOW_QUOTA_USER $LFS setstripe $TESTFILE 65536 0 1 chown $TSTUSR.$TSTUSR $TESTFILE echo " Write ..." - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) > /dev/null 2>&1 || error "(usr) write failure, but expect success" + $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) || error "(usr) write failure, but expect success" echo " Done" echo " Write out of block quota ..." # this time maybe cache write, ignore it's failure - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) seek=$(($LIMIT/2)) > /dev/null 2>&1 || echo " " > /dev/null + $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) seek=$(($LIMIT/2)) || true # flush cache, ensure noquota flag is setted on client sync; sleep 1; sync; - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$LIMIT > /dev/null 2>&1 && error "(usr) write success, but expect EDQUOT" - echo " EDQUOT" + $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$LIMIT && error "(usr) write success, but expect EDQUOT" rm -f $TESTFILE - echo " Group quota (limit: $LIMIT bytes)" + echo " Group quota (limit: $LIMIT kbytes)" $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT # clear user limit $LFS setquota -g $TSTUSR 0 $LIMIT 0 0 $MOUNT + $SHOW_QUOTA_GROUP TESTFILE="$TSTDIR/quota_tst11" $LFS setstripe $TESTFILE 65536 0 1 chown $TSTUSR.$TSTUSR $TESTFILE echo " Write ..." - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) > /dev/null 2>&1 || error "(grp) write failure, but expect success" + $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) || error "(grp) write failure, but expect success" echo " Done" echo " Write out of block quota ..." # this time maybe cache write, ignore it's failure - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) seek=$(($LIMIT/2)) > /dev/null 2>&1 || echo " " > /dev/null + $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) seek=$(($LIMIT/2)) || true sync; sleep 1; sync; - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$LIMIT > /dev/null 2>&1 && error "(grp) write success, but expect EDQUOT" - echo " EDQUOT" + $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$LIMIT && error "(grp) write success, but expect EDQUOT" # cleanup rm -f $TESTFILE @@ -359,71 +380,97 @@ test_2() { echo " User quota (limit: $LIMIT files)" $LFS setquota -u $TSTUSR 0 0 0 $LIMIT $MOUNT + $SHOW_QUOTA_USER echo " Create $LIMIT files ..." - for i in `seq ${LIMIT}`; do - $RUNAS touch ${TESTFILE}_$i > /dev/null 2>&1 || error "(usr) touch failure, but except success" - done + $RUNAS createmany -m ${TESTFILE} $LIMIT || \ + error "(usr) create failure, but except success" echo " Done" echo " Create out of file quota ..." - $RUNAS touch ${TESTFILE}_xxx > /dev/null 2>&1 && error "(usr) touch success, but expect EDQUOT" - echo " EDQUOT" + $RUNAS touch ${TESTFILE}_xxx && \ + error "(usr) touch success, but expect EDQUOT" - for i in `seq ${LIMIT}`; do - rm -f ${TESTFILE}_$i - done + unlinkmany ${TESTFILE} $LIMIT + rm ${TESTFILE}_xxx echo " Group quota (limit: $LIMIT files)" $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT # clear user limit $LFS setquota -g $TSTUSR 0 0 0 $LIMIT $MOUNT + $SHOW_QUOTA_GROUP TESTFILE="$TSTDIR/quota_tst21" echo " Create $LIMIT files ..." - for i in `seq ${LIMIT}`; do - $RUNAS touch ${TESTFILE}_$i > /dev/null 2>&1 || error "(grp) touch failure, but expect success" - done + $RUNAS createmany -m ${TESTFILE} $LIMIT || \ + error "(grp) create failure, but expect success" + echo " Done" echo " Create out of file quota ..." + $RUNAS touch ${TESTFILE}_xxx && \ + error "(grp) touch success, but expect EDQUOT" + $RUNAS touch ${TESTFILE}_xxx > /dev/null 2>&1 && error "(grp) touch success, but expect EDQUOT" - echo " EDQUOT" # cleanup - for i in `seq ${LIMIT}`; do - rm -f ${TESTFILE}_$i - done + unlinkmany ${TESTFILE} $LIMIT + rm ${TESTFILE}_xxx + $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT } run_test 2 "File hard limit (normal use and out of quota) ===" test_block_soft() { TESTFILE=$1 - GRACE=$2 + TIMER=$(($2 * 3 / 2)) + OFFSET=0 echo " Write to exceed soft limit" - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ >/dev/null 2>&1 || error "write failure, but expect success" + RUNDD="$RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ" + $RUNDD count=$((BUNIT_SZ+1)) || \ + error "write failure, but expect success" + OFFSET=$((OFFSET + BUNIT_SZ + 1)) sync; sleep 1; sync; + $SHOW_QUOTA_USER + $SHOW_QUOTA_GROUP + $SHOW_QUOTA_INFO + echo " Write before timer goes off" - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$BUNIT_SZ >/dev/null 2>&1 || error "write failure, but expect success" + $RUNDD count=$BUNIT_SZ seek=$OFFSET || \ + error "write failure, but expect success" + OFFSET=$((OFFSET + BUNIT_SZ)) + sync; sleep 1; sync; echo " Done" - echo " Sleep $GRACE seconds ..." - sleep $GRACE + echo " Sleep $TIMER seconds ..." + sleep $TIMER + + $SHOW_QUOTA_USER + $SHOW_QUOTA_GROUP + $SHOW_QUOTA_INFO echo " Write after timer goes off" # maybe cache write, ignore. sync; sleep 1; sync; - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$(($BUNIT_SZ * 2)) >/dev/null 2>&1 || echo " " > /dev/null + $RUNDD count=$BUNIT_SZ seek=$OFFSET || true + OFFSET=$((OFFSET + BUNIT_SZ)) sync; sleep 1; sync; - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=1 seek=$(($BUNIT_SZ * 3)) >/dev/null 2>&1 && error "write success, but expect EDQUOT" - echo " EDQUOT" + $RUNDD count=$BUNIT_SZ seek=$OFFSET && \ + error "write success, but expect EDQUOT" + + $SHOW_QUOTA_USER + $SHOW_QUOTA_GROUP + $SHOW_QUOTA_INFO echo " Unlink file to stop timer" rm -f $TESTFILE echo " Done" + $SHOW_QUOTA_USER + $SHOW_QUOTA_GROUP + $SHOW_QUOTA_INFO + echo " Write ..." - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ >/dev/null 2>&1 || error "write failure, but expect success" + $RUNDD count=$BUNIT_SZ || error "write failure, but expect success" echo " Done" # cleanup @@ -435,7 +482,7 @@ test_3() { LIMIT=$(( $BUNIT_SZ * 2 )) # 1 bunit on mds and 1 bunit on the ost GRACE=10 - echo " User quota (soft limit: $LIMIT bytes grace: $GRACE seconds)" + echo " User quota (soft limit: $LIMIT kbytes grace: $GRACE seconds)" TESTFILE="$TSTDIR/quota_tst30" $LFS setstripe $TESTFILE 65536 0 1 chown $TSTUSR.$TSTUSR $TESTFILE @@ -446,14 +493,13 @@ test_3() { test_block_soft $TESTFILE $GRACE $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT - echo " Group quota (soft limit: $LIMIT bytes grace: $GRACE seconds)" + echo " Group quota (soft limit: $LIMIT kbytes grace: $GRACE seconds)" TESTFILE="$TSTDIR/quota_tst31" $LFS setstripe $TESTFILE 65536 0 1 chown $TSTUSR.$TSTUSR $TESTFILE $LFS setquota -t -g $GRACE $MAX_IQ_TIME $MOUNT $LFS setquota -g $TSTUSR $LIMIT 0 0 0 $MOUNT - TESTFILE="$TSTDIR/quota_tst31" test_block_soft $TESTFILE $GRACE $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT @@ -463,40 +509,42 @@ run_test 3 "Block soft limit (start timer, timer goes off, stop timer) ===" test_file_soft() { TESTFILE=$1 LIMIT=$2 - GRACE=$3 + TIMER=$(($3 * 3 / 2)) echo " Create files to exceed soft limit" - for i in `seq $LIMIT`; do - $RUNAS touch ${TESTFILE}_$i >/dev/null 2>&1 || error "touch failure, but expect success" - done + $RUNAS createmany -m ${TESTFILE}_ $((LIMIT + 1)) || \ + error "create failure, but expect success" echo " Done" echo " Create file before timer goes off" - $RUNAS touch ${TESTFILE}_before >/dev/null 2>&1 || error "touch before timer goes off failure, but expect success" + $RUNAS touch ${TESTFILE}_before || \ + error "failed create before timer expired, but expect success" echo " Done" - echo " Sleep $GRACE seconds ..." - sleep $GRACE + echo " Sleep $TIMER seconds ..." + sleep $TIMER + + $SHOW_QUOTA_USER + $SHOW_QUOTA_GROUP + $SHOW_QUOTA_INFO echo " Create file after timer goes off" - for i in `seq $(($IUNIT_SZ - 1))`; do - $RUNAS touch ${TESTFILE}_after_$i >/dev/null 2>&1 || error "touch ${TESTFILE}_after_$i failure, but expect success" - done - $RUNAS touch ${TESTFILE}_after >/dev/null 2>&1 && error "touch after timer goes off success, but expect EDQUOT" - echo " EDQUOT" - + $RUNAS createmany -m ${TESTFILE}_after_ $((IUNIT_SZ - 2)) || \ + error "create ${TESTFILE}_after failure, but expect success" + $RUNAS touch ${TESTFILE}_after && \ + error "create after timer expired, but expect EDQUOT" + + $SHOW_QUOTA_USER + $SHOW_QUOTA_GROUP + $SHOW_QUOTA_INFO + echo " Unlink files to stop timer" - for i in `seq $LIMIT`; do - rm -f ${TESTFILE}_$i >/dev/null 2>&1 || error "rm ${TESTFILE}_$i failure" - done - rm -f ${TESTFILE}_before - for i in `seq $(($IUNIT_SZ - 1))`; do - rm -f ${TESTFILE}_after_$i >/dev/null 2>&1 || error "rm ${TESTFILE}_after_$i failure" - done + find `dirname $TESTFILE` -name "`basename ${TESTFILE}`*" | xargs rm -f echo " Done" echo " Create file" - $RUNAS touch ${TESTFILE}_xxx >/dev/null 2>&1 || error "touch after timer stop failure, but expect success" + $RUNAS touch ${TESTFILE}_xxx || \ + error "touch after timer stop failure, but expect success" echo " Done" # cleanup @@ -512,6 +560,7 @@ test_4() { echo " User quota (soft limit: $LIMIT files grace: $GRACE seconds)" $LFS setquota -t -u $MAX_DQ_TIME $GRACE $MOUNT $LFS setquota -u $TSTUSR 0 0 $LIMIT 0 $MOUNT + $SHOW_QUOTA_USER test_file_soft $TESTFILE $LIMIT $GRACE $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT @@ -519,6 +568,7 @@ test_4() { echo " Group quota (soft limit: $LIMIT files grace: $GRACE seconds)" $LFS setquota -t -g $MAX_DQ_TIME $GRACE $MOUNT $LFS setquota -g $TSTUSR 0 0 $LIMIT 0 $MOUNT + $SHOW_QUOTA_GROUP TESTFILE="$TSTDIR/quota_tst41" test_file_soft $TESTFILE $LIMIT $GRACE @@ -538,26 +588,27 @@ test_5() { echo " Set quota limit (0 $BLIMIT 0 $ILIMIT) for $TSTUSR.$TSTUSR" $LFS setquota -u $TSTUSR 0 $BLIMIT 0 $ILIMIT $MOUNT $LFS setquota -g $TSTUSR 0 $BLIMIT 0 $ILIMIT $MOUNT + $SHOW_QUOTA_USER + $SHOW_QUOTA_GROUP - echo " Create more than $ILIMIT files and alloc more than $BLIMIT blocks ..." - for i in `seq $(($ILIMIT + 1))`; do - touch $TSTDIR/quota_tst50_$i > /dev/null 2>&1 || error "touch failure, expect success" - done - dd if=/dev/zero of=$TSTDIR/quota_tst50_1 bs=$BLK_SZ count=$(($BLIMIT+1)) > /dev/null 2>&1 || error "write failure, expect success" + echo " Create more than $ILIMIT files and more than $BLIMIT kbytes ..." + createmany -m $TSTDIR/quota_tst50_ $((ILIMIT + 1)) || \ + error "touch failure, expect success" + dd if=/dev/zero of=$TSTDIR/quota_tst50_1 bs=$BLK_SZ count=$((BLIMIT+1)) || error "write failure, expect success" echo " Chown files to $TSTUSR.$TSTUSR ..." - for i in `seq $(($ILIMIT + 1))`; do - chown $TSTUSR.$TSTUSR $TSTDIR/quota_tst50_$i > /dev/null 2>&1 || error "chown failure, but expect success" + for i in `seq 0 ILIMIT`; do + chown $TSTUSR.$TSTUSR $TSTDIR/quota_tst50_$i || \ + error "chown failure, but expect success" done # cleanup - for i in `seq $(($ILIMIT + 1))`; do - rm -f $TSTDIR/quota_tst50_$i - done + unlinkmany $TSTDIR/quota_tst50_ $((ILIMIT + 1)) + $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT } -run_test 5 "Chown & chgrp (chown & chgrp successfully even out of block/file quota) ===" +run_test 5 "Chown & chgrp successfully even out of block/file quota ===" # block quota acquire & release test_6() { @@ -566,13 +617,15 @@ test_6() { return 0; fi - LIMIT=$(($BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits per server + LIMIT=$((BUNIT_SZ * (OSTCOUNT + 1) * 5)) # 5 bunits per server FILEA="$TSTDIR/quota_tst60_a" FILEB="$TSTDIR/quota_tst60_b" - echo " Set block limit $LIMIT bytes to $TSTUSR.$TSTUSR" + echo " Set block limit $LIMIT kbytes to $TSTUSR.$TSTUSR" $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $MOUNT $LFS setquota -g $TSTUSR 0 $LIMIT 0 0 $MOUNT + $SHOW_QUOTA_USER + $SHOW_QUOTA_GROUP echo " Create filea on OST0 and fileb on OST1" $LFS setstripe $FILEA 65536 0 1 @@ -581,22 +634,33 @@ test_6() { chown $TSTUSR.$TSTUSR $FILEB echo " Exceed quota limit ..." - $RUNAS dd if=/dev/zero of=$FILEB bs=$BLK_SZ count=$(($LIMIT - $BUNIT_SZ * $OSTCOUNT)) >/dev/null 2>&1 || error "write fileb failure, but expect success" - #sync; sleep 1; sync; - $RUNAS dd if=/dev/zero of=$FILEB bs=$BLK_SZ seek=$LIMIT count=$BUNIT_SZ >/dev/null 2>&1 && error "write fileb success, but expect EDQUOT" - #sync; sleep 1; sync; + RUNDD="$RUNAS dd if=/dev/zero of=$FILEB bs=$BLK_SZ" + $RUNDD count=$((LIMIT - BUNIT_SZ * OSTCOUNT)) || \ + error "write fileb failure, but expect success" + + sync; sleep 1; sync; + $SHOW_QUOTA_USER + $SHOW_QUOTA_GROUP + $RUNDD seek=$LIMIT count=$((BUNIT_SZ * OSTCOUNT)) && \ + error "write fileb success, but expect EDQUOT" + sync; sleep 1; sync; echo " Write to OST0 return EDQUOT" # this write maybe cache write, ignore it's failure - $RUNAS dd if=/dev/zero of=$FILEA bs=$BLK_SZ count=$(($BUNIT_SZ * 2)) >/dev/null 2>&1 || echo " " > /dev/null + RUNDD="$RUNAS dd if=/dev/zero of=$FILEA bs=$BLK_SZ" + $RUNDD count=$(($BUNIT_SZ * 2)) || true sync; sleep 1; sync; - $RUNAS dd if=/dev/zero of=$FILEA bs=$BLK_SZ count=$(($BUNIT_SZ * 2)) seek=$(($BUNIT_SZ *2)) >/dev/null 2>&1 && error "write filea success, but expect EDQUOT" - echo " EDQUOT" + $SHOW_QUOTA_USER + $SHOW_QUOTA_GROUP + $RUNDD count=$((BUNIT_SZ * 2)) seek=$((BUNIT_SZ *2)) && \ + error "write filea success, but expect EDQUOT" echo " Remove fileb to let OST1 release quota" rm -f $FILEB + sync; sleep 10; sync; # need to allow journal commit for small fs echo " Write to OST0" - $RUNAS dd if=/dev/zero of=$FILEA bs=$BLK_SZ count=$(($LIMIT - $BUNIT_SZ * $OSTCOUNT)) >/dev/null 2>&1 || error "write filea failure, expect success" + $RUNDD count=$((LIMIT - BUNIT_SZ * OSTCOUNT)) || \ + error "write filea failure, expect success" echo " Done" # cleanup @@ -624,7 +688,8 @@ test_7() chown $TSTUSR.$TSTUSR $TESTFILE echo " Write to OST0..." - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ >/dev/null 2>&1 || error "write failure, but expect success" + $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ || \ + error "write failure, but expect success" #define OBD_FAIL_OBD_DQACQ 0x604 echo 0x604 > /proc/sys/lustre/fail_loc @@ -635,7 +700,7 @@ test_7() echo " Trigger recovery..." OSC0_UUID="`$LCTL dl | awk '$3 ~ /osc/ { print $1 }'`" for i in $OSC0_UUID; do - $LCTL --device $i activate > /dev/null 2>&1 || error "activate osc failed!" + $LCTL --device $i activate || error "activate osc failed!" done # sleep a while to wait for recovery done @@ -683,6 +748,7 @@ test_8() { $RUNAS dbench -c client.txt 3 RC=$? + rm -f client.txt cd $SAVE_PWD return $RC } @@ -690,12 +756,12 @@ run_test 8 "Run dbench with quota enabled ===========" # run for fixing bug10707, it needs a big room. test for 64bit test_9() { - lustrefs_size=`df | grep $MOUNT | awk '{print $(NF - 2)}' | sed -n 1p` + lustrefs_size=`(echo 0; df -t lustre -P | awk '{print $4}') | tail -n 1` size_file=$((1024 * 1024 * 9 / 2 * $OSTCOUNT)) echo "lustrefs_size:$lustrefs_size size_file:$size_file" if [ $lustrefs_size -lt $size_file ]; then - echo "WARN: too few capacity, skip this test." - return 0; + echo "WARN: less than $size_file free, skip this test." + return 0; fi # set the D_QUOTA flag @@ -704,7 +770,7 @@ test_9() { TESTFILE="$TSTDIR/quota_tst90" - echo " Set block limit $LIMIT bytes to $TSTUSR.$TSTUSR" + echo " Set block limit $LIMIT kbytes to $TSTUSR.$TSTUSR" BLK_LIMIT=$((100 * 1024 * 1024)) # 100G FILE_LIMIT=1000000 @@ -719,16 +785,16 @@ test_9() { chown $TSTUSR.$TSTUSR $TESTFILE echo " Write the big file of $(($OSTCOUNT * 9 / 2 ))G ..." - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$size_file >/dev/null 2>&1 || error "(usr) write $((9 / 2 * $OSTCOUNT))G file failure, but expect success" + $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$size_file || error "(usr) write $((9 / 2 * $OSTCOUNT))G file failure, but expect success" echo " delete the big file of $(($OSTCOUNT * 9 / 2))G..." - $RUNAS rm -f $TESTFILE >/dev/null 2>&1 + $RUNAS rm -f $TESTFILE echo " write the big file of 2G..." - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$((1024 * 1024 * 2)) >/dev/null 2>&1 || error "(usr) write $((9 / 2 * $OSTCOUNT))G file failure, but expect seccess" + $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$((1024 * 1024 * 2)) || error "(usr) write $((9 / 2 * $OSTCOUNT))G file failure, but expect seccess" echo " delete the big file of 2G..." - $RUNAS rm -f $TESTFILE >/dev/null 2>&1 + $RUNAS rm -f $TESTFILE RC=$? sysctl -w lnet.debug="$DBG_SAVE" @@ -738,69 +804,76 @@ run_test 9 "run for fixing bug10707(64bit) ===========" # run for fixing bug10707, it need a big room. test for 32bit test_10() { - lustrefs_size=`df | grep $MOUNT | awk '{print $(NF - 2)}' | sed -n 1p` - size_file=$((1024 * 1024 * 9 / 2 * $OSTCOUNT)) - echo "lustrefs_size:$lustrefs_size size_file:$size_file" - if [ $lustrefs_size -lt $size_file ]; then - echo "WARN: too few capacity, skip this test." - return 0; - fi + lustrefs_size=`(echo 0; df -t lustre -P | awk '{print $4}') | tail -n 1` + size_file=$((1024 * 1024 * 9 / 2 * $OSTCOUNT)) + echo "lustrefs_size:$lustrefs_size size_file:$size_file" + if [ $lustrefs_size -lt $size_file ]; then + echo "WARN: less than $size_file free, skip this test." + return 0; + fi - if [ ! -d /proc/fs/lustre/ost/ -o ! -d /proc/fs/lustre/mds ]; then - echo "WARN: mds or ost isn't on the local machine, skip this test." - return 0; - fi + if [ ! -d /proc/fs/lustre/ost/ -o ! -d /proc/fs/lustre/mds ]; then + echo "WARN: mds or ost isn't local, skip this test." + return 0; + fi - sync; sleep 10; sync; + sync; sleep 10; sync; - # set the D_QUOTA flag - DBG_SAVE="`sysctl -n lnet.debug`" - sysctl -w lnet.debug="$DBG_SAVE quota" + # set the D_QUOTA flag + set_flag=0 + if [ -z "`sysctl lnet.debug | grep quota`" ]; then + sysctl -w lnet.debug="+quota" + set_flag=1 + fi - # make qd_count 32 bit - sysctl -w lustre.fail_loc=2560 + # make qd_count 32 bit + sysctl -w lustre.fail_loc=0xA00 - TESTFILE="$TSTDIR/quota_tst100" + TESTFILE="$TSTDIR/quota_tst100" - echo " Set block limit $LIMIT bytes to $TSTUSR.$TSTUSR" - BLK_LIMIT=$((100 * 1024 * 1024)) # 100G - FILE_LIMIT=1000000 + echo " Set block limit $LIMIT kbytes to $TSTUSR.$TSTUSR" + BLK_LIMIT=$((100 * 1024 * 1024)) # 100G + FILE_LIMIT=1000000 - echo " Set enough high limit for user: $TSTUSR" - $LFS setquota -u $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT - echo " Set enough high limit for group: $TSTUSR" - $LFS setquota -g $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT + echo " Set enough high limit for user: $TSTUSR" + $LFS setquota -u $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT + echo " Set enough high limit for group: $TSTUSR" + $LFS setquota -g $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT + + echo " Set stripe" + [ $OSTCOUNT -ge 2 ] && $LFS setstripe $TESTFILE 65536 0 $OSTCOUNT + touch $TESTFILE + chown $TSTUSR.$TSTUSR $TESTFILE - echo " Set stripe" - [ $OSTCOUNT -ge 2 ] && $LFS setstripe $TESTFILE 65536 0 $OSTCOUNT - touch $TESTFILE - chown $TSTUSR.$TSTUSR $TESTFILE + echo " Write the big file of $(($OSTCOUNT * 9 / 2 ))G ..." + $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$size_file || error "(usr) write $((9 / 2 * $OSTCOUNT))G file failure, but expect success" - echo " Write the big file of $(($OSTCOUNT * 9 / 2 ))G ..." - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$size_file >/dev/null 2>&1 || error "(usr) write $((9 / 2 * $OSTCOUNT))G file failure, but expect success" + echo " delete the big file of $(($OSTCOUNT * 9 / 2))G..." + $RUNAS rm -f $TESTFILE - echo " delete the big file of $(($OSTCOUNT * 9 / 2))G..." - $RUNAS rm -f $TESTFILE >/dev/null 2>&1 + echo " write the big file of 2G..." + $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$((1024 * 1024 * 2)) || error "(usr) write $((9 / 2 * $OSTCOUNT))G file failure, but expect success" - echo " write the big file of 2G..." - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$((1024 * 1024 * 2)) >/dev/null 2>&1 || error "(usr) write $((9 / 2 * $OSTCOUNT))G file failure, but expect success" + echo " delete the big file of 2G..." + $RUNAS rm -f $TESTFILE - echo " delete the big file of 2G..." - $RUNAS rm -f $TESTFILE >/dev/null 2>&1 - RC=$? + RC=$? - sysctl -w lnet.debug="$DBG_SAVE" + # clear the flage + if [ $set_flag -eq 1 ]; then + sysctl -w lnet.debug="-quota" + fi - # make qd_count 64 bit - sysctl -w lustre.fail_loc=0 + # make qd_count 64 bit + sysctl -w lustre.fail_loc=0 - return $RC + return $RC } run_test 10 "run for fixing bug10707(32bit) ===========" test_11() { #prepare the test - block_limit=`df | grep $MOUNT | awk '{print $(NF - 4)}'| sed -n 1p` + block_limit=`(echo 0; df -t lustre -P | awk '{print $(NF - 4)}') | tail -n 1` echo $block_limit orig_dbr=`cat /proc/sys/vm/dirty_background_ratio` orig_dec=`cat /proc/sys/vm/dirty_expire_centisecs` @@ -858,13 +931,14 @@ test_11() { } run_test 11 "run for fixing bug10912 ===========" + # test a deadlock between quota and journal b=11693 test_12() { LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits each sever TESTFILE="$TSTDIR/quota_tst120" TESTFILE2="$TSTDIR2/quota_tst121" - echo " User quota (limit: $LIMIT kilobytes)" + echo " User quota (limit: $LIMIT kbytes)" $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $MOUNT $LFS setstripe $TESTFILE 65536 0 1 @@ -876,10 +950,10 @@ test_12() { sysctl -w lustre.fail_loc=0x0000021f echo " step1: write out of block quota ..." - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT*2)) & > /dev/null 2>&1 + $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT*2)) & DDPID=$! sleep 5 - $RUNAS2 dd if=/dev/zero of=$TESTFILE2 bs=$BLK_SZ count=102400 & > /dev/null 2>&1 + $RUNAS2 dd if=/dev/zero of=$TESTFILE2 bs=$BLK_SZ count=102400 & DDPID1=$! echo " step2: testing ......" @@ -918,23 +992,24 @@ run_test 12 "test a deadlock between quota and journal ===" # test multiple clients write block quota b=11693 test_13() { - LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 8 + $BUNIT_SZ )) - TESTFILE="$TSTDIR/quota_tst130" - TESTFILE2="$TSTDIR2/quota_tst131" + # one OST * 10 + (mds + other OSTs) + LIMIT=$((BUNIT_SZ * 10 + (BUNIT_SZ * OSTCOUNT))) + TESTFILE="$TSTDIR/quota_tst13" - echo " User quota (limit: $LIMIT kilobytes)" + echo " User quota (limit: $LIMIT kbytes)" $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $MOUNT + $SHOW_QUOTA_USER $LFS setstripe $TESTFILE 65536 0 1 chown $TSTUSR.$TSTUSR $TESTFILE - $LFS setstripe $TESTFILE2 65536 0 1 - chown $TSTUSR.$TSTUSR $TESTFILE2 + $LFS setstripe $TESTFILE.2 65536 0 1 + chown $TSTUSR.$TSTUSR $TESTFILE.2 echo " step1: write out of block quota ..." # one bunit will give mds - $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$[($LIMIT - $BUNIT_SZ) / 2] & > /dev/null 2>&1 + $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$[($LIMIT - $BUNIT_SZ) / 2] & DDPID=$! - $RUNAS dd if=/dev/zero of=$TESTFILE2 bs=$BLK_SZ count=$[($LIMIT - $BUNIT_SZ) / 2] & > /dev/null 2>&1 + $RUNAS dd if=/dev/zero of=$TESTFILE.2 bs=$BLK_SZ count=$[($LIMIT - $BUNIT_SZ) / 2] & DDPID1=$! echo " step2: testing ......" @@ -963,12 +1038,15 @@ test_13() { sync; sleep 5; sync; echo " step3: checking ......" - fz=`stat -t $TESTFILE | awk '{print $2}'` - fz2=`stat -t $TESTFILE2 | awk '{print $2}'` - [ $fz -ne $[($LIMIT - $BUNIT_SZ) / 2 * $BLK_SZ] ] && error "test13 failed!" - [ $fz2 -ne $[($LIMIT - $BUNIT_SZ) / 2 * $BLK_SZ] ] && error "test13 failed!" - - rm -f $TESTFILE $TESTFILE2 + fz=`stat -c %s $TESTFILE` + fz2=`stat -c %s $TESTFILE.2` + $SHOW_QUOTA_USER + [ $((fz + fz2)) -lt $((BUNIT_SZ * BLK_SZ * 10)) ] && \ + error "files too small $fz + $fz < $((BUNIT_SZ * BLK_SZ * 10))" + [ $((fz + fz2)) -gt $((BUNIT_SZ * BLK_SZ * 11)) ] && \ + error "files too large $fz + $fz > $((BUNIT_SZ * BLK_SZ * 11))" + + rm -f $TESTFILE $TESTFILE.2 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT # clear user limit } @@ -986,7 +1064,9 @@ run_test 99 "Quota off ===============================" log "cleanup: ======================================================" if [ "`mount | grep ^$NAME`" ]; then rm -fr $TSTDIR - post_test + if [ $TEST_9_10 -eq 0 ]; then + post_test + fi # delete test user and group userdel "$TSTUSR" userdel "$TSTUSR2"