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 RUNAS=${RUNAS:-"runas -u $TSTID"}
39 TSTUSR=${TSTUSR:-"quota_usr"}
41 BUNIT_SZ=${BUNIT_SZ:-1000} # default 1000 quota blocks
42 BTUNE_SZ=${BTUNE_SZ:-500} # default 50% of BUNIT_SZ
43 IUNIT_SZ=${IUNIT_SZ:-10} # default 10 files
44 ITUNE_SZ=${ITUNE_SZ:-5} # default 50% of IUNIT_SZ
50 $LCTL mark "$*" 2> /dev/null || true
55 strace -o $TMP/$1.strace -ttt $*
57 log "FINISHED: $*: rc $RC"
64 log "== test $1: $2= `date +%H:%M:%S` ($BEFORE)"
65 export TESTNAME=test_$1
66 test_$1 || error "exit with rc=$?"
68 pass "($((`date +%s` - $BEFORE))s)"
76 for E in $EXCEPT $ALWAYS_EXCEPT; do
79 # turn on/off quota tests must be included
89 IFS=abcdefghijklmnopqrstuvwxyz _basetest $1
96 if [ ${!testname}x != x ]; then
101 if [ ${!testname}x != x ]; then
109 if [ ${!testname}x != x ]; then
110 echo "skipping excluded test $1"
113 testname=EXCEPT_$base
114 if [ ${!testname}x != x ]; then
115 echo "skipping excluded test $1 (base $base)"
122 [ "$QUOTALOG" ] && rm -f $QUOTALOG || true
125 sysctl -w lustre.fail_loc=0
126 log "FAIL: $TESTNAME $@"
127 if [ "$QUOTALOG" ]; then
128 echo "FAIL: $TESTNAME $@" >> $QUOTALOG
138 mounted_lustre_filesystems() {
139 awk '($3 ~ "lustre" && $1 ~ ":") { print $2 }' /proc/mounts
141 MOUNT="`mounted_lustre_filesystems`"
142 if [ -z "$MOUNT" ]; then
143 export QUOTA_OPTS="quotaon=ug"
145 MOUNT="`mounted_lustre_filesystems`"
146 [ -z "$MOUNT" ] && error "NAME=$NAME not mounted"
150 [ `echo $MOUNT | wc -w` -gt 1 ] && error "NAME=$NAME mounted more than once"
153 [ -z "`echo $DIR | grep $MOUNT`" ] && echo "$DIR not in $MOUNT" && exit 99
155 LPROC=/proc/fs/lustre
156 LOVNAME=`cat $LPROC/llite/*/lov/common_name | tail -n 1`
157 OSTCOUNT=`cat $LPROC/lov/$LOVNAME/numobd`
158 STRIPECOUNT=`cat $LPROC/lov/$LOVNAME/stripecount`
159 STRIPESIZE=`cat $LPROC/lov/$LOVNAME/stripesize`
160 ORIGFREE=`cat $LPROC/lov/$LOVNAME/kbytesavail`
161 MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))}
162 MDS=$(\ls $LPROC/mds 2> /dev/null | grep -v num_refs | tail -n 1)
163 TSTDIR="$MOUNT/quota_dir"
168 # set_blk_tunables(btune_sz)
170 # set btune size on all obdfilters
171 for i in `ls /proc/fs/lustre/obdfilter/*/quota_btune_sz`; do
172 echo $(($1 * $BLK_SZ)) > $i
174 # set btune size on mds
175 for i in `ls /proc/fs/lustre/mds/lustre-MDT*/quota_btune_sz`; do
176 echo $(($1 * $BLK_SZ)) > $i
179 # se_blk_unitsz(bunit_sz)
181 for i in `ls /proc/fs/lustre/obdfilter/*/quota_bunit_sz`; do
182 echo $(($1 * $BLK_SZ)) > $i
184 for i in `ls /proc/fs/lustre/mds/lustre-MDT*/quota_bunit_sz`; do
185 echo $(($1 * $BLK_SZ)) > $i
188 # set_file_tunesz(itune_sz)
190 # set iunit and itune size on all obdfilters
191 for i in `ls /proc/fs/lustre/obdfilter/*/quota_itune_sz`; do
194 # set iunit and itune size on mds
195 for i in `ls /proc/fs/lustre/mds/lustre-MDT*/quota_itune_sz`; do
201 # set_file_unitsz(iunit_sz)
203 for i in `ls /proc/fs/lustre/obdfilter/*/quota_iunit_sz`; do
206 for i in `ls /proc/fs/lustre/mds/lustre-MDT*/quota_iunit_sz`; do
211 # These are for test on local machine,if run sanity-quota.sh on
212 # real cluster, ltest should have setup the test environment:
214 # - create test user/group on all servers with same id.
215 # - set unit size/tune on all servers size to reasonable value.
217 if [ -z "$NOSETUP" ]; then
219 set_blk_tunesz $BTUNE_SZ
220 set_blk_unitsz $BUNIT_SZ
222 set_file_tunesz $ITUNE_SZ
223 set_file_unitsz $IUNIT_SZ
229 if [ -z "$NOSETUP" ]; then
230 # restore block tunables to default size
231 set_blk_unitsz $((1024 * 100))
232 set_blk_tunesz $((1024 * 50))
233 # restore file tunables to default size
240 # create local test group
241 GRP="`cat /etc/group | grep "$TSTUSR" | awk -F: '{print $1}'`"
242 if [ -z "$GRP" ]; then
243 groupadd -g $TSTID "$TSTUSR"
245 TSTID="`cat /etc/group | grep "$TSTUSR" | awk -F: '{print $3}'`"
248 USR="`cat /etc/passwd | grep "$TSTUSR" | awk -F: '{print $1}'`"
249 if [ -z "$USR" ]; then
250 useradd -u $TSTID -g $TSTID -d /tmp "$TSTUSR"
253 RUNAS="runas -u $TSTID"
255 # create test directory
256 [ -d $TSTDIR ] || mkdir $TSTDIR
263 $LFS quotaoff -ug $MOUNT
264 $LFS quotacheck -ug $MOUNT
266 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
267 $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
269 run_test 0 "Set quota ============================="
271 # block hard limit (normal use and out of quota)
273 LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits each sever
274 TESTFILE="$TSTDIR/quota_tst10"
276 echo " User quota (limit: $LIMIT bytes)"
277 $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $MOUNT
279 $LFS setstripe $TESTFILE 65536 0 1
280 chown $TSTUSR.$TSTUSR $TESTFILE
283 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) > /dev/null 2>&1 || error "(usr) write failure, but expect success"
285 echo " Write out of block quota ..."
286 # this time maybe cache write, ignore it's failure
287 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) seek=$(($LIMIT/2)) > /dev/null 2>&1 || echo " " > /dev/null
288 # flush cache, ensure noquota flag is setted on client
290 $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"
295 echo " Group quota (limit: $LIMIT bytes)"
296 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT # clear user limit
297 $LFS setquota -g $TSTUSR 0 $LIMIT 0 0 $MOUNT
298 TESTFILE="$TSTDIR/quota_tst11"
300 $LFS setstripe $TESTFILE 65536 0 1
301 chown $TSTUSR.$TSTUSR $TESTFILE
304 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) > /dev/null 2>&1 || error "(grp) write failure, but expect success"
306 echo " Write out of block quota ..."
307 # this time maybe cache write, ignore it's failure
308 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) seek=$(($LIMIT/2)) > /dev/null 2>&1 || echo " " > /dev/null
310 $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"
315 $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
317 run_test 1 "Block hard limit (normal use and out of quota) ==="
319 # file hard limit (normal use and out of quota)
321 LIMIT=$(($IUNIT_SZ * 10)) # 10 iunits on mds
322 TESTFILE="$TSTDIR/quota_tstr20"
324 echo " User quota (limit: $LIMIT files)"
325 $LFS setquota -u $TSTUSR 0 0 0 $LIMIT $MOUNT
327 echo " Create $LIMIT files ..."
328 for i in `seq ${LIMIT}`; do
329 $RUNAS touch ${TESTFILE}_$i > /dev/null 2>&1 || error "(usr) touch failure, but except success"
332 echo " Create out of file quota ..."
333 $RUNAS touch ${TESTFILE}_xxx > /dev/null 2>&1 && error "(usr) touch success, but expect EDQUOT"
336 for i in `seq ${LIMIT}`; do
340 echo " Group quota (limit: $LIMIT files)"
341 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT # clear user limit
342 $LFS setquota -g $TSTUSR 0 0 0 $LIMIT $MOUNT
343 TESTFILE="$TSTDIR/quota_tst21"
345 echo " Create $LIMIT files ..."
346 for i in `seq ${LIMIT}`; do
347 $RUNAS touch ${TESTFILE}_$i > /dev/null 2>&1 || error "(grp) touch failure, but expect success"
350 echo " Create out of file quota ..."
351 $RUNAS touch ${TESTFILE}_xxx > /dev/null 2>&1 && error "(grp) touch success, but expect EDQUOT"
355 for i in `seq ${LIMIT}`; do
358 $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
360 run_test 2 "File hard limit (normal use and out of quota) ==="
366 echo " Write to exceed soft limit"
367 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ >/dev/null 2>&1 || error "write failure, but expect success"
370 echo " Write before timer goes off"
371 $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"
374 echo " Sleep $GRACE seconds ..."
377 echo " Write after timer goes off"
378 # maybe cache write, ignore.
380 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$(($BUNIT_SZ * 2)) >/dev/null 2>&1 || echo " " > /dev/null
382 $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"
385 echo " Unlink file to stop timer"
390 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ >/dev/null 2>&1 || error "write failure, but expect success"
397 # block soft limit (start timer, timer goes off, stop timer)
399 LIMIT=$(( $BUNIT_SZ * 2 )) # 1 bunit on mds and 1 bunit on the ost
402 echo " User quota (soft limit: $LIMIT bytes grace: $GRACE seconds)"
403 TESTFILE="$TSTDIR/quota_tst30"
404 $LFS setstripe $TESTFILE 65536 0 1
405 chown $TSTUSR.$TSTUSR $TESTFILE
407 $LFS setquota -t -u $GRACE $MAX_IQ_TIME $MOUNT
408 $LFS setquota -u $TSTUSR $LIMIT 0 0 0 $MOUNT
410 test_block_soft $TESTFILE $GRACE
411 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
413 echo " Group quota (soft limit: $LIMIT bytes grace: $GRACE seconds)"
414 TESTFILE="$TSTDIR/quota_tst31"
415 $LFS setstripe $TESTFILE 65536 0 1
416 chown $TSTUSR.$TSTUSR $TESTFILE
418 $LFS setquota -t -g $GRACE $MAX_IQ_TIME $MOUNT
419 $LFS setquota -g $TSTUSR $LIMIT 0 0 0 $MOUNT
420 TESTFILE="$TSTDIR/quota_tst31"
422 test_block_soft $TESTFILE $GRACE
423 $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
425 run_test 3 "Block soft limit (start timer, timer goes off, stop timer) ==="
432 echo " Create files to exceed soft limit"
433 for i in `seq $LIMIT`; do
434 $RUNAS touch ${TESTFILE}_$i >/dev/null 2>&1 || error "touch failure, but expect success"
438 echo " Create file before timer goes off"
439 $RUNAS touch ${TESTFILE}_before >/dev/null 2>&1 || error "touch before timer goes off failure, but expect success"
442 echo " Sleep $GRACE seconds ..."
445 echo " Create file after timer goes off"
446 for i in `seq $(($IUNIT_SZ - 1))`; do
447 $RUNAS touch ${TESTFILE}_after_$i >/dev/null 2>&1 || error "touch ${TESTFILE}_after_$i failure, but expect success"
449 $RUNAS touch ${TESTFILE}_after >/dev/null 2>&1 && error "touch after timer goes off success, but expect EDQUOT"
452 echo " Unlink files to stop timer"
453 for i in `seq $LIMIT`; do
454 rm -f ${TESTFILE}_$i >/dev/null 2>&1 || error "rm ${TESTFILE}_$i failure"
456 rm -f ${TESTFILE}_before
457 for i in `seq $(($IUNIT_SZ - 1))`; do
458 rm -f ${TESTFILE}_after_$i >/dev/null 2>&1 || error "rm ${TESTFILE}_after_$i failure"
463 $RUNAS touch ${TESTFILE}_xxx >/dev/null 2>&1 || error "touch after timer stop failure, but expect success"
467 rm -f ${TESTFILE}_xxx
470 # file soft limit (start timer, timer goes off, stop timer)
472 LIMIT=$(($IUNIT_SZ * 10)) # 10 iunits on mds
473 TESTFILE="$TSTDIR/quota_tst40"
476 echo " User quota (soft limit: $LIMIT files grace: $GRACE seconds)"
477 $LFS setquota -t -u $MAX_DQ_TIME $GRACE $MOUNT
478 $LFS setquota -u $TSTUSR 0 0 $LIMIT 0 $MOUNT
480 test_file_soft $TESTFILE $LIMIT $GRACE
481 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
483 echo " Group quota (soft limit: $LIMIT files grace: $GRACE seconds)"
484 $LFS setquota -t -g $MAX_DQ_TIME $GRACE $MOUNT
485 $LFS setquota -g $TSTUSR 0 0 $LIMIT 0 $MOUNT
486 TESTFILE="$TSTDIR/quota_tst41"
488 test_file_soft $TESTFILE $LIMIT $GRACE
489 $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
492 $LFS setquota -t -u $MAX_DQ_TIME $MAX_IQ_TIME $MOUNT
493 $LFS setquota -t -g $MAX_DQ_TIME $MAX_IQ_TIME $MOUNT
495 run_test 4 "File soft limit (start timer, timer goes off, stop timer) ==="
497 # chown & chgrp (chown & chgrp successfully even out of block/file quota)
499 BLIMIT=$(( $BUNIT_SZ * $((OSTCOUNT + 1)) * 10)) # 10 bunits on each server
500 ILIMIT=$(( $IUNIT_SZ * 10 )) # 10 iunits on mds
502 echo " Set quota limit (0 $BLIMIT 0 $ILIMIT) for $TSTUSR.$TSTUSR"
503 $LFS setquota -u $TSTUSR 0 $BLIMIT 0 $ILIMIT $MOUNT
504 $LFS setquota -g $TSTUSR 0 $BLIMIT 0 $ILIMIT $MOUNT
506 echo " Create more than $ILIMIT files and alloc more than $BLIMIT blocks ..."
507 for i in `seq $(($ILIMIT + 1))`; do
508 touch $TSTDIR/quota_tst50_$i > /dev/null 2>&1 || error "touch failure, expect success"
510 dd if=/dev/zero of=$TSTDIR/quota_tst50_1 bs=$BLK_SZ count=$(($BLIMIT+1)) > /dev/null 2>&1 || error "write failure, expect success"
512 echo " Chown files to $TSTUSR.$TSTUSR ..."
513 for i in `seq $(($ILIMIT + 1))`; do
514 chown $TSTUSR.$TSTUSR $TSTDIR/quota_tst50_$i > /dev/null 2>&1 || error "chown failure, but expect success"
518 for i in `seq $(($ILIMIT + 1))`; do
519 rm -f $TSTDIR/quota_tst50_$i
521 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
522 $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
524 run_test 5 "Chown & chgrp (chown & chgrp successfully even out of block/file quota) ==="
526 # block quota acquire & release
528 if [ $OSTCOUNT -lt 2 ]; then
529 echo "WARN: too few osts, skip this test."
533 LIMIT=$(($BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits per server
534 FILEA="$TSTDIR/quota_tst60_a"
535 FILEB="$TSTDIR/quota_tst60_b"
537 echo " Set block limit $LIMIT bytes to $TSTUSR.$TSTUSR"
538 $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $MOUNT
539 $LFS setquota -g $TSTUSR 0 $LIMIT 0 0 $MOUNT
541 echo " Create filea on OST0 and fileb on OST1"
542 $LFS setstripe $FILEA 65536 0 1
543 $LFS setstripe $FILEB 65536 1 1
544 chown $TSTUSR.$TSTUSR $FILEA
545 chown $TSTUSR.$TSTUSR $FILEB
547 echo " Exceed quota limit ..."
548 $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"
549 #sync; sleep 1; sync;
550 $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"
551 #sync; sleep 1; sync;
552 echo " Write to OST0 return EDQUOT"
553 # this write maybe cache write, ignore it's failure
554 $RUNAS dd if=/dev/zero of=$FILEA bs=$BLK_SZ count=$(($BUNIT_SZ * 2)) >/dev/null 2>&1 || echo " " > /dev/null
556 $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"
559 echo " Remove fileb to let OST1 release quota"
562 echo " Write to OST0"
563 $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"
568 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
569 $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
572 run_test 6 "Block quota acquire & release ========="
574 # quota recovery (block quota only by now)
577 if [ -z "`lsmod|grep mds`" ]; then
578 echo "WARN: no local mds, skip this test"
582 LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits each sever
583 TESTFILE="$TSTDIR/quota_tst70"
585 $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $MOUNT
587 $LFS setstripe $TESTFILE 65536 0 1
588 chown $TSTUSR.$TSTUSR $TESTFILE
590 echo " Write to OST0..."
591 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ >/dev/null 2>&1 || error "write failure, but expect success"
593 #define OBD_FAIL_OBD_DQACQ 0x604
594 echo 0x604 > /proc/sys/lustre/fail_loc
595 echo " Remove files on OST0"
597 echo 0 > /proc/sys/lustre/fail_loc
599 echo " Trigger recovery..."
600 OSC0_UUID="`$LCTL dl | awk '$3 ~ /osc/ { print $1 }'`"
601 for i in $OSC0_UUID; do
602 $LCTL --device $i activate > /dev/null 2>&1 || error "activate osc failed!"
605 # sleep a while to wait for recovery done
609 PATTERN="`echo $MOUNT | sed 's/\//\\\\\//g'`"
610 TOTAL_LIMIT="`$LFS quota -u $TSTUSR $MOUNT | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $4 }'`"
611 [ $TOTAL_LIMIT -eq $LIMIT ] || error "total limits not recovery!"
612 echo " total limits = $TOTAL_LIMIT"
614 OST0_UUID=`$LCTL dl | awk '$3 ~ /obdfilter/ { print $5 }'| head -n1`
615 [ -z "$OST0_UUID" ] && OST0_UUID=`$LCTL dl | awk '$3 ~ /obdfilter/ { print $5 }'|head -n1`
616 OST0_LIMIT="`$LFS quota -o $OST0_UUID -u $TSTUSR $MOUNT | awk '/^.*[[:digit:]+][[:space:]+]/ { print $3 }'`"
617 [ $OST0_LIMIT -eq $BUNIT_SZ ] || error "high limits not released!"
618 echo " limits on $OST0_UUID = $OST0_LIMIT"
621 $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
623 run_test 7 "Quota recovery (only block limit) ======"
625 # run dbench with quota enabled
627 BLK_LIMIT=$((100 * 1024 * 1024)) # 100G
629 DBENCH_LIB=${DBENCH_LIB:-/usr/lib/dbench}
631 [ ! -d $DBENCH_LIB ] && echo "dbench not installed, skip this test" && return 0
633 echo " Set enough high limit for user: $TSTUSR"
634 $LFS setquota -u $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT
635 echo " Set enough high limit for group: $TSTUSR"
636 $LFS setquota -g $USER 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT
639 TGT=$TSTDIR/client.txt
640 SRC=${SRC:-$DBENCH_LIB/client.txt}
641 [ ! -e $TGT -a -e $SRC ] && echo "copying $SRC to $TGT" && cp $SRC $TGT
642 SRC=$DBENCH_LIB/client_plain.txt
643 [ ! -e $TGT -a -e $SRC ] && echo "copying $SRC to $TGT" && cp $SRC $TGT
647 $RUNAS dbench -c client.txt 3
653 run_test 8 "Run dbench with quota enabled ==========="
655 # run for fixing bug10707, it needs a big room. test for 64bit
657 lustrefs_size=`df | grep $MOUNT | awk '{print $(NF - 2)}'`
658 size_file=$((1024 * 1024 * 9 / 2 * $OSTCOUNT))
659 echo "lustrefs_size:$lustrefs_size size_file:$size_file"
660 if [ $lustrefs_size -lt $size_file ]; then
661 echo "WARN: too few capacity, skip this test."
665 # set the D_QUOTA flag
666 DBG_SAVE="`sysctl -n lnet.debug`"
667 sysctl -w lnet.debug="$DBG_SAVE quota"
669 TESTFILE="$TSTDIR/quota_tst90"
671 echo " Set block limit $LIMIT bytes to $TSTUSR.$TSTUSR"
672 BLK_LIMIT=$((100 * 1024 * 1024)) # 100G
675 echo " Set enough high limit for user: $TSTUSR"
676 $LFS setquota -u $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT
677 echo " Set enough high limit for group: $TSTUSR"
678 $LFS setquota -g $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT
681 [ $OSTCOUNT -ge 2 ] && $LFS setstripe $TESTFILE 65536 0 $OSTCOUNT
683 chown $TSTUSR.$TSTUSR $TESTFILE
685 echo " Write the big file of $(($OSTCOUNT * 9 / 2 ))G ..."
686 $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"
688 echo " delete the big file of $(($OSTCOUNT * 9 / 2))G..."
689 $RUNAS rm -f $TESTFILE >/dev/null 2>&1
691 echo " write the big file of 2G..."
692 $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"
694 echo " delete the big file of 2G..."
695 $RUNAS rm -f $TESTFILE >/dev/null 2>&1
698 sysctl -w lnet.debug="$DBG_SAVE"
701 run_test 9 "run for fixing bug10707(64bit) ==========="
703 # run for fixing bug10707, it need a big room. test for 32bit
705 lustrefs_size=`df | grep $MOUNT | awk '{print $(NF - 2)}'`
706 size_file=$((1024 * 1024 * 9 / 2 * $OSTCOUNT))
707 echo "lustrefs_size:$lustrefs_size size_file:$size_file"
708 if [ $lustrefs_size -lt $size_file ]; then
709 echo "WARN: too few capacity, skip this test."
713 if [ ! -d /proc/fs/lustre/ost/ -o ! -d /proc/fs/lustre/mds ]; then
714 echo "WARN: mds or ost isn't on the local machine, skip this test."
718 sync; sleep 10; sync;
720 # set the D_QUOTA flag
721 DBG_SAVE="`sysctl -n lnet.debug`"
722 sysctl -w lnet.debug="$DBG_SAVE quota"
724 # make qd_count 32 bit
725 sysctl -w lustre.fail_loc=2560
727 TESTFILE="$TSTDIR/quota_tst100"
729 echo " Set block limit $LIMIT bytes to $TSTUSR.$TSTUSR"
730 BLK_LIMIT=$((100 * 1024 * 1024)) # 100G
733 echo " Set enough high limit for user: $TSTUSR"
734 $LFS setquota -u $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT
735 echo " Set enough high limit for group: $TSTUSR"
736 $LFS setquota -g $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT
739 [ $OSTCOUNT -ge 2 ] && $LFS setstripe $TESTFILE 65536 0 $OSTCOUNT
741 chown $TSTUSR.$TSTUSR $TESTFILE
743 echo " Write the big file of $(($OSTCOUNT * 9 / 2 ))G ..."
744 $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"
746 echo " delete the big file of $(($OSTCOUNT * 9 / 2))G..."
747 $RUNAS rm -f $TESTFILE >/dev/null 2>&1
749 echo " write the big file of 2G..."
750 $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"
752 echo " delete the big file of 2G..."
753 $RUNAS rm -f $TESTFILE >/dev/null 2>&1
756 sysctl -w lnet.debug="$DBG_SAVE"
758 # make qd_count 64 bit
759 sysctl -w lustre.fail_loc=0
763 run_test 10 "run for fixing bug10707(32bit) ==========="
767 block_limit=`df | grep $MOUNT | awk '{print $(NF - 4)}'`
769 orig_dbr=`cat /proc/sys/vm/dirty_background_ratio`
770 orig_dec=`cat /proc/sys/vm/dirty_expire_centisecs`
771 orig_dr=`cat /proc/sys/vm/dirty_ratio`
772 orig_dwc=`cat /proc/sys/vm/dirty_writeback_centisecs`
773 echo 1 > /proc/sys/vm/dirty_background_ratio
774 echo 30 > /proc/sys/vm/dirty_expire_centisecs
775 echo 1 > /proc/sys/vm/dirty_ratio
776 echo 50 > /proc/sys/vm/dirty_writeback_centisecs
777 TESTDIR="$TSTDIR/quota_tst110"
784 while [ $i -le $REPS ]; do
785 echo "test: cycle($i of $REPS) start at $(date)"
786 mkdir -p $TESTDIR && chmod 777 $TESTDIR
787 echo -n " create a file for uid "
788 for j in `seq 1 30`; do
790 runas -u $j dd if=/dev/zero of=$TESTDIR/$j bs=$BLK_SZ > /dev/null 2>&1 &
793 PROCS=$(ps -e | grep dd | wc -l)
794 while [ $PROCS -gt 0 ]; do
797 PROCS=$(ps -e | grep dd | wc -l)
798 USED=$(du -s $TESTDIR | awk '{print $1}')
799 PCT=$(($USED * 100 / $block_limit))
800 echo "${i}/${REPS} ${PCT}% p${PROCS} t${MINS} "
801 if [ $MINS -gt 30 ]; then
802 error "Aborting after $MINS minutes"
803 kill -9 $(ps -ef | grep $TESTDIR | grep -v grep | awk '{ print $2 }')
809 echo " removing the test files..."
811 echo "cycle $i done at $(date)"
814 echo "Test took $MINS minutes"
817 echo $orig_dbr > /proc/sys/vm/dirty_background_ratio
818 echo $orig_dec > /proc/sys/vm/dirty_expire_centisecs
819 echo $orig_dr > /proc/sys/vm/dirty_ratio
820 echo $orig_dwc > /proc/sys/vm/dirty_writeback_centisecs
823 run_test 11 "run for fixing bug10912 ==========="
831 run_test 99 "Quota off ==============================="
834 log "cleanup: ======================================================"
835 if [ "`mount | grep ^$NAME`" ]; then
838 # delete test user and group
840 if [ "$I_MOUNTED" = "yes" ]; then
841 cd $ORIG_PWD && (sh llmountcleanup.sh || error "llmountcleanup failed")
845 echo '=========================== finished ==============================='
846 [ -f "$QUOTALOG" ] && cat $QUOTALOG && exit 1