3 # Run select tests by setting ONLY, or as arguments to the script.
4 # Skip specific tests by setting EXCEPT.
6 # Run test by setting NOSETUP=true when ltest has setup env for us
9 #kernel 2.4.x doesn't support quota
10 K_VER=`uname --kernel-release | cut -b 1-3`
11 if [ $K_VER = "2.4" ]; then
12 echo "Kernel 2.4 doesn't support quota"
17 export PATH=$PWD/$SRCDIR:$SRCDIR:$PWD/$SRCDIR/../utils:$PATH:/sbin
20 ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-""}
21 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
24 2.6*) FSTYPE=${FSTYPE:-ldiskfs};;
25 *) error "unsupported kernel" ;;
28 [ "$ALWAYS_EXCEPT$EXCEPT" ] && \
29 echo "Skipping tests: `echo $ALWAYS_EXCEPT $EXCEPT`"
36 SETSTRIPE=${SETSTRIPE:-"$LFS setstripe"}
38 TSTID2=${TSTID2:-60001}
39 RUNAS=${RUNAS:-"runas -u $TSTID"}
40 RUNAS2=${RUNAS2:-"runas -u $TSTID2"}
41 TSTUSR=${TSTUSR:-"quota_usr"}
42 TSTUSR2=${TSTUSR2:-"quota_2usr"}
44 BUNIT_SZ=${BUNIT_SZ:-1000} # default 1000 quota blocks
45 BTUNE_SZ=${BTUNE_SZ:-500} # default 50% of BUNIT_SZ
46 IUNIT_SZ=${IUNIT_SZ:-10} # default 10 files
47 ITUNE_SZ=${ITUNE_SZ:-5} # default 50% of IUNIT_SZ
53 $LCTL mark "$*" 2> /dev/null || true
58 strace -o $TMP/$1.strace -ttt $*
60 log "FINISHED: $*: rc $RC"
67 log "== test $1: $2= `date +%H:%M:%S` ($BEFORE)"
68 export TESTNAME=test_$1
69 test_$1 || error "exit with rc=$?"
71 pass "($((`date +%s` - $BEFORE))s)"
79 for E in $EXCEPT $ALWAYS_EXCEPT; do
82 # turn on/off quota tests must be included
92 IFS=abcdefghijklmnopqrstuvwxyz _basetest $1
99 if [ ${!testname}x != x ]; then
104 if [ ${!testname}x != x ]; then
112 if [ ${!testname}x != x ]; then
113 echo "skipping excluded test $1"
116 testname=EXCEPT_$base
117 if [ ${!testname}x != x ]; then
118 echo "skipping excluded test $1 (base $base)"
125 [ "$QUOTALOG" ] && rm -f $QUOTALOG || true
128 sysctl -w lustre.fail_loc=0
129 log "FAIL: $TESTNAME $@"
130 if [ "$QUOTALOG" ]; then
131 echo "FAIL: $TESTNAME $@" >> $QUOTALOG
141 mounted_lustre_filesystems() {
142 awk '($3 ~ "lustre" && $1 ~ ":") { print $2 }' /proc/mounts | sed -n $1p
145 # Remember where our caller has hinted that we should mount lustre
148 MOUNT="`mounted_lustre_filesystems 1`"
149 MOUNT2="`mounted_lustre_filesystems 2`"
150 if [ -n "$MOUNT" -a -z "$MOUNT2" ]; then
151 error "this test needs two mount point!"
153 if [ -z "$MOUNT" -a -n "$MOUNT2" ]; then
154 error "this test needs two mount point!"
156 if [ -z "$MOUNT" -a -z "$MOUNT2" ]; then
157 export QUOTA_OPTS="quotaon=ug"
158 export MOUNT=$MOUNT_HINT
159 export MOUNT2=$MOUNT_HINT2
160 MOUNT2=${MOUNT2:-/mnt/lustre2}
162 MOUNT="`mounted_lustre_filesystems 1`"
163 MOUNT2="`mounted_lustre_filesystems 2`"
164 [ -z "$MOUNT" ] && error "NAME=$MOUNT not mounted"
165 [ -z "$MOUNT2" ] && error "NAME=$MOUNT2 not mounted"
169 [ `echo $MOUNT | wc -w` -gt 1 ] && error "NAME=$NAME mounted more than once"
172 [ -z "`echo $DIR | grep $MOUNT`" ] && echo "$DIR not in $MOUNT" && exit 99
174 LPROC=/proc/fs/lustre
175 LOVNAME=`cat $LPROC/llite/*/lov/common_name | tail -n 1`
176 OSTCOUNT=`cat $LPROC/lov/$LOVNAME/numobd`
177 STRIPECOUNT=`cat $LPROC/lov/$LOVNAME/stripecount`
178 STRIPESIZE=`cat $LPROC/lov/$LOVNAME/stripesize`
179 ORIGFREE=`cat $LPROC/lov/$LOVNAME/kbytesavail`
180 MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))}
181 MDS=$(\ls $LPROC/mds 2> /dev/null | grep -v num_refs | tail -n 1)
182 TSTDIR="$MOUNT/quota_dir"
183 TSTDIR2="$MOUNT2/quota_dir"
188 # set_blk_tunables(btune_sz)
190 # set btune size on all obdfilters
191 for i in `ls /proc/fs/lustre/obdfilter/*/quota_btune_sz`; do
192 echo $(($1 * $BLK_SZ)) > $i
194 # set btune size on mds
195 for i in `ls /proc/fs/lustre/mds/lustre-MDT*/quota_btune_sz`; do
196 echo $(($1 * $BLK_SZ)) > $i
199 # se_blk_unitsz(bunit_sz)
201 for i in `ls /proc/fs/lustre/obdfilter/*/quota_bunit_sz`; do
202 echo $(($1 * $BLK_SZ)) > $i
204 for i in `ls /proc/fs/lustre/mds/lustre-MDT*/quota_bunit_sz`; do
205 echo $(($1 * $BLK_SZ)) > $i
208 # set_file_tunesz(itune_sz)
210 # set iunit and itune size on all obdfilters
211 for i in `ls /proc/fs/lustre/obdfilter/*/quota_itune_sz`; do
214 # set iunit and itune size on mds
215 for i in `ls /proc/fs/lustre/mds/lustre-MDT*/quota_itune_sz`; do
221 # set_file_unitsz(iunit_sz)
223 for i in `ls /proc/fs/lustre/obdfilter/*/quota_iunit_sz`; do
226 for i in `ls /proc/fs/lustre/mds/lustre-MDT*/quota_iunit_sz`; do
231 # These are for test on local machine,if run sanity-quota.sh on
232 # real cluster, ltest should have setup the test environment:
234 # - create test user/group on all servers with same id.
235 # - set unit size/tune on all servers size to reasonable value.
237 if [ -z "$NOSETUP" ]; then
239 set_blk_tunesz $BTUNE_SZ
240 set_blk_unitsz $BUNIT_SZ
242 set_file_tunesz $ITUNE_SZ
243 set_file_unitsz $IUNIT_SZ
249 if [ -z "$NOSETUP" ]; then
250 # restore block tunables to default size
251 set_blk_unitsz $((1024 * 100))
252 set_blk_tunesz $((1024 * 50))
253 # restore file tunables to default size
260 # create local test group
261 GRP="`cat /etc/group | grep "$TSTUSR" | awk -F: '{print $1}'`"
262 if [ -z "$GRP" ]; then
263 groupadd -g $TSTID "$TSTUSR"
265 TSTID="`cat /etc/group | grep "$TSTUSR" | awk -F: '{print $3}'`"
267 GRP2="`cat /etc/group | grep "$TSTUSR2" | awk -F: '{print $1}'`"
268 if [ -z "$GRP2" ]; then
269 groupadd -g $TSTID2 "$TSTUSR2"
271 TSTID2="`cat /etc/group | grep "$TSTUSR2" | awk -F: '{print $3}'`"
274 USR="`cat /etc/passwd | grep "$TSTUSR" | awk -F: '{print $1}'`"
275 if [ -z "$USR" ]; then
276 useradd -u $TSTID -g $TSTID -d /tmp "$TSTUSR"
279 RUNAS="runas -u $TSTID"
281 USR2="`cat /etc/passwd | grep "$TSTUSR2" | awk -F: '{print $1}'`"
282 if [ -z "$USR2" ]; then
283 useradd -u $TSTID2 -g $TSTID2 -d /tmp "$TSTUSR2"
286 RUNAS2="runas -u $TSTID2"
288 # create test directory
289 [ -d $TSTDIR ] || mkdir $TSTDIR
292 [ -d $TSTDIR2 ] || mkdir $TSTDIR2
299 $LFS quotaoff -ug $MOUNT
300 $LFS quotacheck -ug $MOUNT
302 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
303 $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
305 run_test 0 "Set quota ============================="
307 # block hard limit (normal use and out of quota)
309 LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits each sever
310 TESTFILE="$TSTDIR/quota_tst10"
312 echo " User quota (limit: $LIMIT bytes)"
313 $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $MOUNT
315 $LFS setstripe $TESTFILE 65536 0 1
316 chown $TSTUSR.$TSTUSR $TESTFILE
319 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) > /dev/null 2>&1 || error "(usr) write failure, but expect success"
321 echo " Write out of block quota ..."
322 # this time maybe cache write, ignore it's failure
323 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) seek=$(($LIMIT/2)) > /dev/null 2>&1 || echo " " > /dev/null
324 # flush cache, ensure noquota flag is setted on client
326 $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"
331 echo " Group quota (limit: $LIMIT bytes)"
332 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT # clear user limit
333 $LFS setquota -g $TSTUSR 0 $LIMIT 0 0 $MOUNT
334 TESTFILE="$TSTDIR/quota_tst11"
336 $LFS setstripe $TESTFILE 65536 0 1
337 chown $TSTUSR.$TSTUSR $TESTFILE
340 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) > /dev/null 2>&1 || error "(grp) write failure, but expect success"
342 echo " Write out of block quota ..."
343 # this time maybe cache write, ignore it's failure
344 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) seek=$(($LIMIT/2)) > /dev/null 2>&1 || echo " " > /dev/null
346 $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"
351 $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
353 run_test 1 "Block hard limit (normal use and out of quota) ==="
355 # file hard limit (normal use and out of quota)
357 LIMIT=$(($IUNIT_SZ * 10)) # 10 iunits on mds
358 TESTFILE="$TSTDIR/quota_tstr20"
360 echo " User quota (limit: $LIMIT files)"
361 $LFS setquota -u $TSTUSR 0 0 0 $LIMIT $MOUNT
363 echo " Create $LIMIT files ..."
364 for i in `seq ${LIMIT}`; do
365 $RUNAS touch ${TESTFILE}_$i > /dev/null 2>&1 || error "(usr) touch failure, but except success"
368 echo " Create out of file quota ..."
369 $RUNAS touch ${TESTFILE}_xxx > /dev/null 2>&1 && error "(usr) touch success, but expect EDQUOT"
372 for i in `seq ${LIMIT}`; do
376 echo " Group quota (limit: $LIMIT files)"
377 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT # clear user limit
378 $LFS setquota -g $TSTUSR 0 0 0 $LIMIT $MOUNT
379 TESTFILE="$TSTDIR/quota_tst21"
381 echo " Create $LIMIT files ..."
382 for i in `seq ${LIMIT}`; do
383 $RUNAS touch ${TESTFILE}_$i > /dev/null 2>&1 || error "(grp) touch failure, but expect success"
386 echo " Create out of file quota ..."
387 $RUNAS touch ${TESTFILE}_xxx > /dev/null 2>&1 && error "(grp) touch success, but expect EDQUOT"
391 for i in `seq ${LIMIT}`; do
394 $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
396 run_test 2 "File hard limit (normal use and out of quota) ==="
402 echo " Write to exceed soft limit"
403 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ >/dev/null 2>&1 || error "write failure, but expect success"
406 echo " Write before timer goes off"
407 $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"
410 echo " Sleep $GRACE seconds ..."
413 echo " Write after timer goes off"
414 # maybe cache write, ignore.
416 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$(($BUNIT_SZ * 2)) >/dev/null 2>&1 || echo " " > /dev/null
418 $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"
421 echo " Unlink file to stop timer"
426 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ >/dev/null 2>&1 || error "write failure, but expect success"
433 # block soft limit (start timer, timer goes off, stop timer)
435 LIMIT=$(( $BUNIT_SZ * 2 )) # 1 bunit on mds and 1 bunit on the ost
438 echo " User quota (soft limit: $LIMIT bytes grace: $GRACE seconds)"
439 TESTFILE="$TSTDIR/quota_tst30"
440 $LFS setstripe $TESTFILE 65536 0 1
441 chown $TSTUSR.$TSTUSR $TESTFILE
443 $LFS setquota -t -u $GRACE $MAX_IQ_TIME $MOUNT
444 $LFS setquota -u $TSTUSR $LIMIT 0 0 0 $MOUNT
446 test_block_soft $TESTFILE $GRACE
447 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
449 echo " Group quota (soft limit: $LIMIT bytes grace: $GRACE seconds)"
450 TESTFILE="$TSTDIR/quota_tst31"
451 $LFS setstripe $TESTFILE 65536 0 1
452 chown $TSTUSR.$TSTUSR $TESTFILE
454 $LFS setquota -t -g $GRACE $MAX_IQ_TIME $MOUNT
455 $LFS setquota -g $TSTUSR $LIMIT 0 0 0 $MOUNT
456 TESTFILE="$TSTDIR/quota_tst31"
458 test_block_soft $TESTFILE $GRACE
459 $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
461 run_test 3 "Block soft limit (start timer, timer goes off, stop timer) ==="
468 echo " Create files to exceed soft limit"
469 for i in `seq $LIMIT`; do
470 $RUNAS touch ${TESTFILE}_$i >/dev/null 2>&1 || error "touch failure, but expect success"
474 echo " Create file before timer goes off"
475 $RUNAS touch ${TESTFILE}_before >/dev/null 2>&1 || error "touch before timer goes off failure, but expect success"
478 echo " Sleep $GRACE seconds ..."
481 echo " Create file after timer goes off"
482 for i in `seq $(($IUNIT_SZ - 1))`; do
483 $RUNAS touch ${TESTFILE}_after_$i >/dev/null 2>&1 || error "touch ${TESTFILE}_after_$i failure, but expect success"
485 $RUNAS touch ${TESTFILE}_after >/dev/null 2>&1 && error "touch after timer goes off success, but expect EDQUOT"
488 echo " Unlink files to stop timer"
489 for i in `seq $LIMIT`; do
490 rm -f ${TESTFILE}_$i >/dev/null 2>&1 || error "rm ${TESTFILE}_$i failure"
492 rm -f ${TESTFILE}_before
493 for i in `seq $(($IUNIT_SZ - 1))`; do
494 rm -f ${TESTFILE}_after_$i >/dev/null 2>&1 || error "rm ${TESTFILE}_after_$i failure"
499 $RUNAS touch ${TESTFILE}_xxx >/dev/null 2>&1 || error "touch after timer stop failure, but expect success"
503 rm -f ${TESTFILE}_xxx
506 # file soft limit (start timer, timer goes off, stop timer)
508 LIMIT=$(($IUNIT_SZ * 10)) # 10 iunits on mds
509 TESTFILE="$TSTDIR/quota_tst40"
512 echo " User quota (soft limit: $LIMIT files grace: $GRACE seconds)"
513 $LFS setquota -t -u $MAX_DQ_TIME $GRACE $MOUNT
514 $LFS setquota -u $TSTUSR 0 0 $LIMIT 0 $MOUNT
516 test_file_soft $TESTFILE $LIMIT $GRACE
517 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
519 echo " Group quota (soft limit: $LIMIT files grace: $GRACE seconds)"
520 $LFS setquota -t -g $MAX_DQ_TIME $GRACE $MOUNT
521 $LFS setquota -g $TSTUSR 0 0 $LIMIT 0 $MOUNT
522 TESTFILE="$TSTDIR/quota_tst41"
524 test_file_soft $TESTFILE $LIMIT $GRACE
525 $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
528 $LFS setquota -t -u $MAX_DQ_TIME $MAX_IQ_TIME $MOUNT
529 $LFS setquota -t -g $MAX_DQ_TIME $MAX_IQ_TIME $MOUNT
531 run_test 4 "File soft limit (start timer, timer goes off, stop timer) ==="
533 # chown & chgrp (chown & chgrp successfully even out of block/file quota)
535 BLIMIT=$(( $BUNIT_SZ * $((OSTCOUNT + 1)) * 10)) # 10 bunits on each server
536 ILIMIT=$(( $IUNIT_SZ * 10 )) # 10 iunits on mds
538 echo " Set quota limit (0 $BLIMIT 0 $ILIMIT) for $TSTUSR.$TSTUSR"
539 $LFS setquota -u $TSTUSR 0 $BLIMIT 0 $ILIMIT $MOUNT
540 $LFS setquota -g $TSTUSR 0 $BLIMIT 0 $ILIMIT $MOUNT
542 echo " Create more than $ILIMIT files and alloc more than $BLIMIT blocks ..."
543 for i in `seq $(($ILIMIT + 1))`; do
544 touch $TSTDIR/quota_tst50_$i > /dev/null 2>&1 || error "touch failure, expect success"
546 dd if=/dev/zero of=$TSTDIR/quota_tst50_1 bs=$BLK_SZ count=$(($BLIMIT+1)) > /dev/null 2>&1 || error "write failure, expect success"
548 echo " Chown files to $TSTUSR.$TSTUSR ..."
549 for i in `seq $(($ILIMIT + 1))`; do
550 chown $TSTUSR.$TSTUSR $TSTDIR/quota_tst50_$i > /dev/null 2>&1 || error "chown failure, but expect success"
554 for i in `seq $(($ILIMIT + 1))`; do
555 rm -f $TSTDIR/quota_tst50_$i
557 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
558 $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
560 run_test 5 "Chown & chgrp (chown & chgrp successfully even out of block/file quota) ==="
562 # block quota acquire & release
564 if [ $OSTCOUNT -lt 2 ]; then
565 echo "WARN: too few osts, skip this test."
569 LIMIT=$(($BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits per server
570 FILEA="$TSTDIR/quota_tst60_a"
571 FILEB="$TSTDIR/quota_tst60_b"
573 echo " Set block limit $LIMIT bytes to $TSTUSR.$TSTUSR"
574 $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $MOUNT
575 $LFS setquota -g $TSTUSR 0 $LIMIT 0 0 $MOUNT
577 echo " Create filea on OST0 and fileb on OST1"
578 $LFS setstripe $FILEA 65536 0 1
579 $LFS setstripe $FILEB 65536 1 1
580 chown $TSTUSR.$TSTUSR $FILEA
581 chown $TSTUSR.$TSTUSR $FILEB
583 echo " Exceed quota limit ..."
584 $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"
585 #sync; sleep 1; sync;
586 $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"
587 #sync; sleep 1; sync;
588 echo " Write to OST0 return EDQUOT"
589 # this write maybe cache write, ignore it's failure
590 $RUNAS dd if=/dev/zero of=$FILEA bs=$BLK_SZ count=$(($BUNIT_SZ * 2)) >/dev/null 2>&1 || echo " " > /dev/null
592 $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"
595 echo " Remove fileb to let OST1 release quota"
598 echo " Write to OST0"
599 $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"
604 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
605 $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
608 run_test 6 "Block quota acquire & release ========="
610 # quota recovery (block quota only by now)
613 if [ -z "`lsmod|grep mds`" ]; then
614 echo "WARN: no local mds, skip this test"
618 LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits each sever
619 TESTFILE="$TSTDIR/quota_tst70"
621 $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $MOUNT
623 $LFS setstripe $TESTFILE 65536 0 1
624 chown $TSTUSR.$TSTUSR $TESTFILE
626 echo " Write to OST0..."
627 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ >/dev/null 2>&1 || error "write failure, but expect success"
629 #define OBD_FAIL_OBD_DQACQ 0x604
630 echo 0x604 > /proc/sys/lustre/fail_loc
631 echo " Remove files on OST0"
633 echo 0 > /proc/sys/lustre/fail_loc
635 echo " Trigger recovery..."
636 OSC0_UUID="`$LCTL dl | awk '$3 ~ /osc/ { print $1 }'`"
637 for i in $OSC0_UUID; do
638 $LCTL --device $i activate > /dev/null 2>&1 || error "activate osc failed!"
641 # sleep a while to wait for recovery done
645 PATTERN="`echo $MOUNT | sed 's/\//\\\\\//g'`"
646 TOTAL_LIMIT="`$LFS quota -u $TSTUSR $MOUNT | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $4 }'`"
647 [ $TOTAL_LIMIT -eq $LIMIT ] || error "total limits not recovery!"
648 echo " total limits = $TOTAL_LIMIT"
650 OST0_UUID=`$LCTL dl | awk '$3 ~ /obdfilter/ { print $5 }'| head -n1`
651 [ -z "$OST0_UUID" ] && OST0_UUID=`$LCTL dl | awk '$3 ~ /obdfilter/ { print $5 }'|head -n1`
652 OST0_LIMIT="`$LFS quota -o $OST0_UUID -u $TSTUSR $MOUNT | awk '/^.*[[:digit:]+][[:space:]+]/ { print $3 }'`"
653 [ $OST0_LIMIT -eq $BUNIT_SZ ] || error "high limits not released!"
654 echo " limits on $OST0_UUID = $OST0_LIMIT"
657 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
659 run_test 7 "Quota recovery (only block limit) ======"
661 # run dbench with quota enabled
663 BLK_LIMIT=$((100 * 1024 * 1024)) # 100G
665 DBENCH_LIB=${DBENCH_LIB:-/usr/lib/dbench}
667 [ ! -d $DBENCH_LIB ] && echo "dbench not installed, skip this test" && return 0
669 echo " Set enough high limit for user: $TSTUSR"
670 $LFS setquota -u $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT
671 echo " Set enough high limit for group: $TSTUSR"
672 $LFS setquota -g $USER 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT
675 TGT=$TSTDIR/client.txt
676 SRC=${SRC:-$DBENCH_LIB/client.txt}
677 [ ! -e $TGT -a -e $SRC ] && echo "copying $SRC to $TGT" && cp $SRC $TGT
678 SRC=$DBENCH_LIB/client_plain.txt
679 [ ! -e $TGT -a -e $SRC ] && echo "copying $SRC to $TGT" && cp $SRC $TGT
683 $RUNAS dbench -c client.txt 3
689 run_test 8 "Run dbench with quota enabled ==========="
691 # run for fixing bug10707, it needs a big room. test for 64bit
693 lustrefs_size=`df | grep $MOUNT | awk '{print $(NF - 2)}' | sed -n 1p`
694 size_file=$((1024 * 1024 * 9 / 2 * $OSTCOUNT))
695 echo "lustrefs_size:$lustrefs_size size_file:$size_file"
696 if [ $lustrefs_size -lt $size_file ]; then
697 echo "WARN: too few capacity, skip this test."
701 # set the D_QUOTA flag
702 DBG_SAVE="`sysctl -n lnet.debug`"
703 sysctl -w lnet.debug="$DBG_SAVE quota"
705 TESTFILE="$TSTDIR/quota_tst90"
707 echo " Set block limit $LIMIT bytes to $TSTUSR.$TSTUSR"
708 BLK_LIMIT=$((100 * 1024 * 1024)) # 100G
711 echo " Set enough high limit for user: $TSTUSR"
712 $LFS setquota -u $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT
713 echo " Set enough high limit for group: $TSTUSR"
714 $LFS setquota -g $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT
717 [ $OSTCOUNT -ge 2 ] && $LFS setstripe $TESTFILE 65536 0 $OSTCOUNT
719 chown $TSTUSR.$TSTUSR $TESTFILE
721 echo " Write the big file of $(($OSTCOUNT * 9 / 2 ))G ..."
722 $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"
724 echo " delete the big file of $(($OSTCOUNT * 9 / 2))G..."
725 $RUNAS rm -f $TESTFILE >/dev/null 2>&1
727 echo " write the big file of 2G..."
728 $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"
730 echo " delete the big file of 2G..."
731 $RUNAS rm -f $TESTFILE >/dev/null 2>&1
734 sysctl -w lnet.debug="$DBG_SAVE"
737 run_test 9 "run for fixing bug10707(64bit) ==========="
739 # run for fixing bug10707, it need a big room. test for 32bit
741 lustrefs_size=`df | grep $MOUNT | awk '{print $(NF - 2)}' | sed -n 1p`
742 size_file=$((1024 * 1024 * 9 / 2 * $OSTCOUNT))
743 echo "lustrefs_size:$lustrefs_size size_file:$size_file"
744 if [ $lustrefs_size -lt $size_file ]; then
745 echo "WARN: too few capacity, skip this test."
749 if [ ! -d /proc/fs/lustre/ost/ -o ! -d /proc/fs/lustre/mds ]; then
750 echo "WARN: mds or ost isn't on the local machine, skip this test."
754 sync; sleep 10; sync;
756 # set the D_QUOTA flag
757 DBG_SAVE="`sysctl -n lnet.debug`"
758 sysctl -w lnet.debug="$DBG_SAVE quota"
760 # make qd_count 32 bit
761 sysctl -w lustre.fail_loc=2560
763 TESTFILE="$TSTDIR/quota_tst100"
765 echo " Set block limit $LIMIT bytes to $TSTUSR.$TSTUSR"
766 BLK_LIMIT=$((100 * 1024 * 1024)) # 100G
769 echo " Set enough high limit for user: $TSTUSR"
770 $LFS setquota -u $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT
771 echo " Set enough high limit for group: $TSTUSR"
772 $LFS setquota -g $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT
775 [ $OSTCOUNT -ge 2 ] && $LFS setstripe $TESTFILE 65536 0 $OSTCOUNT
777 chown $TSTUSR.$TSTUSR $TESTFILE
779 echo " Write the big file of $(($OSTCOUNT * 9 / 2 ))G ..."
780 $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"
782 echo " delete the big file of $(($OSTCOUNT * 9 / 2))G..."
783 $RUNAS rm -f $TESTFILE >/dev/null 2>&1
785 echo " write the big file of 2G..."
786 $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"
788 echo " delete the big file of 2G..."
789 $RUNAS rm -f $TESTFILE >/dev/null 2>&1
792 sysctl -w lnet.debug="$DBG_SAVE"
794 # make qd_count 64 bit
795 sysctl -w lustre.fail_loc=0
799 run_test 10 "run for fixing bug10707(32bit) ==========="
803 block_limit=`df | grep $MOUNT | awk '{print $(NF - 4)}'| sed -n 1p`
805 orig_dbr=`cat /proc/sys/vm/dirty_background_ratio`
806 orig_dec=`cat /proc/sys/vm/dirty_expire_centisecs`
807 orig_dr=`cat /proc/sys/vm/dirty_ratio`
808 orig_dwc=`cat /proc/sys/vm/dirty_writeback_centisecs`
809 echo 1 > /proc/sys/vm/dirty_background_ratio
810 echo 30 > /proc/sys/vm/dirty_expire_centisecs
811 echo 1 > /proc/sys/vm/dirty_ratio
812 echo 50 > /proc/sys/vm/dirty_writeback_centisecs
813 TESTDIR="$TSTDIR/quota_tst110"
820 while [ $i -le $REPS ]; do
821 echo "test: cycle($i of $REPS) start at $(date)"
822 mkdir -p $TESTDIR && chmod 777 $TESTDIR
823 echo -n " create a file for uid "
824 for j in `seq 1 30`; do
826 runas -u $j dd if=/dev/zero of=$TESTDIR/$j bs=$BLK_SZ > /dev/null 2>&1 &
829 PROCS=$(ps -e | grep dd | wc -l)
830 while [ $PROCS -gt 0 ]; do
833 PROCS=$(ps -e | grep dd | wc -l)
834 USED=$(du -s $TESTDIR | awk '{print $1}')
835 PCT=$(($USED * 100 / $block_limit))
836 echo "${i}/${REPS} ${PCT}% p${PROCS} t${MINS} "
837 if [ $MINS -gt 30 ]; then
838 error "Aborting after $MINS minutes"
839 kill -9 $(ps -ef | grep $TESTDIR | grep -v grep | awk '{ print $2 }')
845 echo " removing the test files..."
847 echo "cycle $i done at $(date)"
850 echo "Test took $MINS minutes"
853 echo $orig_dbr > /proc/sys/vm/dirty_background_ratio
854 echo $orig_dec > /proc/sys/vm/dirty_expire_centisecs
855 echo $orig_dr > /proc/sys/vm/dirty_ratio
856 echo $orig_dwc > /proc/sys/vm/dirty_writeback_centisecs
859 run_test 11 "run for fixing bug10912 ==========="
861 # test a deadlock between quota and journal b=11693
863 LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits each sever
864 TESTFILE="$TSTDIR/quota_tst120"
865 TESTFILE2="$TSTDIR2/quota_tst121"
867 echo " User quota (limit: $LIMIT kilobytes)"
868 $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $MOUNT
870 $LFS setstripe $TESTFILE 65536 0 1
871 chown $TSTUSR.$TSTUSR $TESTFILE
872 $LFS setstripe $TESTFILE2 65536 0 1
873 chown $TSTUSR2.$TSTUSR2 $TESTFILE2
875 #define OBD_FAIL_OST_HOLD_WRITE_RPC 0x21f
876 sysctl -w lustre.fail_loc=0x0000021f
878 echo " step1: write out of block quota ..."
879 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT*2)) & > /dev/null 2>&1
882 $RUNAS2 dd if=/dev/zero of=$TESTFILE2 bs=$BLK_SZ count=102400 & > /dev/null 2>&1
885 echo " step2: testing ......"
888 if [ -z `ps -ef | awk '$2 == '${DDPID1}' { print $8 }'` ]; then break; fi
890 if [ $count -gt 64 ]; then
891 sysctl -w lustre.fail_loc=0
892 error "dd should be finished!"
896 echo "(dd_pid=$DDPID1, time=$count)successful"
898 #Recover fail_loc and dd will finish soon
899 sysctl -w lustre.fail_loc=0
901 echo " step3: testing ......"
904 if [ -z `ps -ef | awk '$2 == '${DDPID}' { print $8 }'` ]; then break; fi
906 if [ $count -gt 100 ]; then
907 error "dd should be finished!"
911 echo "(dd_pid=$DDPID, time=$count)successful"
913 rm -f $TESTFILE $TESTFILE2
915 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT # clear user limit
917 run_test 12 "test a deadlock between quota and journal ==="
919 # test multiple clients write block quota b=11693
921 LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 8 + $BUNIT_SZ ))
922 TESTFILE="$TSTDIR/quota_tst130"
923 TESTFILE2="$TSTDIR2/quota_tst131"
925 echo " User quota (limit: $LIMIT kilobytes)"
926 $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $MOUNT
928 $LFS setstripe $TESTFILE 65536 0 1
929 chown $TSTUSR.$TSTUSR $TESTFILE
930 $LFS setstripe $TESTFILE2 65536 0 1
931 chown $TSTUSR.$TSTUSR $TESTFILE2
933 echo " step1: write out of block quota ..."
934 # one bunit will give mds
935 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$[($LIMIT - $BUNIT_SZ) / 2] & > /dev/null 2>&1
937 $RUNAS dd if=/dev/zero of=$TESTFILE2 bs=$BLK_SZ count=$[($LIMIT - $BUNIT_SZ) / 2] & > /dev/null 2>&1
940 echo " step2: testing ......"
943 if [ -z `ps -ef | awk '$2 == '${DDPID}' { print $8 }'` ]; then break; fi
945 if [ $count -gt 64 ]; then
946 error "dd should be finished!"
950 echo "(dd_pid=$DDPID, time=$count)successful"
954 if [ -z `ps -ef | awk '$2 == '${DDPID1}' { print $8 }'` ]; then break; fi
956 if [ $count -gt 64 ]; then
957 error "dd should be finished!"
961 echo "(dd_pid=$DDPID1, time=$count)successful"
965 echo " step3: checking ......"
966 fz=`stat -t $TESTFILE | awk '{print $2}'`
967 fz2=`stat -t $TESTFILE2 | awk '{print $2}'`
968 [ $fz -ne $[($LIMIT - $BUNIT_SZ) / 2 * $BLK_SZ] ] && error "test13 failed!"
969 [ $fz2 -ne $[($LIMIT - $BUNIT_SZ) / 2 * $BLK_SZ] ] && error "test13 failed!"
971 rm -f $TESTFILE $TESTFILE2
973 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT # clear user limit
975 run_test 13 "test multiple clients write block quota ==="
983 run_test 99 "Quota off ==============================="
986 log "cleanup: ======================================================"
987 if [ "`mount | grep ^$NAME`" ]; then
990 # delete test user and group
993 if [ "$I_MOUNTED" = "yes" ]; then
994 cd $ORIG_PWD && (sh llmountcleanup.sh || error "llmountcleanup failed")
998 echo '=========================== finished ==============================='
999 [ -f "$QUOTALOG" ] && cat $QUOTALOG && exit 1
1000 echo "$0: completed"