export PATH=$PWD/$SRCDIR:$SRCDIR:$PWD/$SRCDIR/../utils:$PATH:/sbin
ONLY=${ONLY:-"$*"}
-ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-""}
+ALWAYS_EXCEPT="$SANITY_QUOTA_EXCEPT"
# UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
case `uname -r` in
TMP=${TMP:-/tmp}
ORIG_PWD=${PWD}
-LFS=${LFS:-lfs}
-LCTL=${LCTL:-lctl}
-SETSTRIPE=${SETSTRIPE:-"$LFS setstripe"}
TSTID=${TSTID:-60000}
-RUNAS=${RUNAS:-"runas -u $TSTID"}
+TSTID2=${TSTID2:-60001}
TSTUSR=${TSTUSR:-"quota_usr"}
+TSTUSR2=${TSTUSR2:-"quota_2usr"}
BLK_SZ=1024
BUNIT_SZ=${BUNIT_SZ:-1000} # default 1000 quota blocks
BTUNE_SZ=${BTUNE_SZ:-500} # default 50% of BUNIT_SZ
MAX_DQ_TIME=604800
MAX_IQ_TIME=604800
-log() {
- echo "$*"
- $LCTL mark "$*" 2> /dev/null || true
-}
-
-trace() {
- log "STARTING: $*"
- strace -o $TMP/$1.strace -ttt $*
- RC=$?
- log "FINISHED: $*: rc $RC"
- return 1
-}
TRACE=${TRACE:-""}
+LUSTRE=${LUSTRE:-`dirname $0`/..}
+. $LUSTRE/tests/test-framework.sh
+init_test_env $@
+. ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
-run_one() {
- BEFORE=`date +%s`
- log "== test $1: $2= `date +%H:%M:%S` ($BEFORE)"
- export TESTNAME=test_$1
- test_$1 || error "exit with rc=$?"
- unset TESTNAME
- pass "($((`date +%s` - $BEFORE))s)"
- cd $SAVE_PWD
-}
-
-build_test_filter() {
- for O in $ONLY; do
- eval ONLY_${O}=true
- done
- for E in $EXCEPT $ALWAYS_EXCEPT; do
- eval EXCEPT_${E}=true
- done
- # turn on/off quota tests must be included
- eval ONLY_0=true
- eval ONLY_99=true
-}
-
-_basetest() {
- echo $*
-}
-
-basetest() {
- IFS=abcdefghijklmnopqrstuvwxyz _basetest $1
-}
+[ "$SLOW" = "no" ] && EXCEPT_SLOW="9 10 11"
-run_test() {
- base=`basetest $1`
- if [ "$ONLY" ]; then
- testname=ONLY_$1
- if [ ${!testname}x != x ]; then
- run_one $1 "$2"
- return $?
- fi
- testname=ONLY_$base
- if [ ${!testname}x != x ]; then
- run_one $1 "$2"
- return $?
- fi
- echo -n "."
- return 0
- fi
- testname=EXCEPT_$1
- if [ ${!testname}x != x ]; then
- echo "skipping excluded test $1"
- return 0
- fi
- testname=EXCEPT_$base
- if [ ${!testname}x != x ]; then
- echo "skipping excluded test $1 (base $base)"
- return 0
- fi
- run_one $1 "$2"
- return $?
-}
+QUOTALOG=${TESTSUITELOG:-$TMP/$(basename $0 .sh).log}
-[ "$SANITYLOG" ] && rm -f $SANITYLOG || true
-
-error() {
- sysctl -w lustre.fail_loc=0
- log "FAIL: $TESTNAME $@"
- if [ "$SANITYLOG" ]; then
- echo "FAIL: $TESTNAME $@" >> $SANITYLOG
- else
- exit 1
- fi
-}
-
-pass() {
- echo PASS $@
-}
-
-mounted_lustre_filesystems() {
- awk '($3 ~ "lustre" && $1 ~ ":") { print $2 }' /proc/mounts
-}
-MOUNT="`mounted_lustre_filesystems`"
-if [ -z "$MOUNT" ]; then
- export QUOTA_OPTS="quotaon=ug"
- sh llmount.sh
- MOUNT="`mounted_lustre_filesystems`"
- [ -z "$MOUNT" ] && error "NAME=$NAME not mounted"
- I_MOUNTED=yes
-fi
-
-[ `echo $MOUNT | wc -w` -gt 1 ] && error "NAME=$NAME mounted more than once"
+[ "$QUOTALOG" ] && rm -f $QUOTALOG || true
DIR=${DIR:-$MOUNT}
-[ -z "`echo $DIR | grep $MOUNT`" ] && echo "$DIR not in $MOUNT" && exit 99
+DIR2=${DIR2:-$MOUNT2}
+
+cleanup_and_setup_lustre
-LPROC=/proc/fs/lustre
LOVNAME=`cat $LPROC/llite/*/lov/common_name | tail -n 1`
OSTCOUNT=`cat $LPROC/lov/$LOVNAME/numobd`
-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"
+
+SHOW_QUOTA_USER="$LFS quota -u $TSTUSR $DIR"
+SHOW_QUOTA_GROUP="$LFS quota -g $TSTUSR $DIR"
+SHOW_QUOTA_INFO="$LFS quota -t $DIR"
+
+# control the time of tests
+cycle=30
+[ "$SLOW" = "no" ] && cycle=10
build_test_filter
+eval ONLY_0=true
+eval ONLY_99=true
# 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
- echo $(($1 * $BLK_SZ)) > $i
- done
+ do_facet ost1 "set -x; 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
- echo $(($1 * $BLK_SZ)) > $i
- done
+ do_facet $SINGLEMDS "for i in /proc/fs/lustre/mds/${FSNAME}-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
- echo $(($1 * $BLK_SZ)) > $i
- done
- for i in `ls /proc/fs/lustre/mds/lustre-MDT*/quota_bunit_sz`; do
- echo $(($1 * $BLK_SZ)) > $i
- done
+ do_facet ost1 "for i in /proc/fs/lustre/obdfilter/*/quota_bunit_sz; do
+ echo $(($1 * BLK_SZ)) >> \\\$i;
+ done"
+ do_facet $SINGLEMDS "for i in /proc/fs/lustre/mds/${FSNAME}-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
- echo $1 > $i
- done
+ do_facet ost1 "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
- echo $1 > $i
- done
-
-
+ do_facet $SINGLEMDS "for i in /proc/fs/lustre/mds/${FSNAME}-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
- echo $1 > $i
- done;
- for i in `ls /proc/fs/lustre/mds/lustre-MDT*/quota_iunit_sz`; do
- echo $1 > $i
- done
+ do_facet ost1 "for i in /proc/fs/lustre/obdfilter/*/quota_iunit_sz; do
+ echo $1 >> \\\$i;
+ done"
+ do_facet $SINGLEMDS "for i in /proc/fs/lustre/mds/${FSNAME}-MDT*/quota_iunit_sz; do
+ echo $1 >> \\\$i;
+ done"
}
# These are for test on local machine,if run sanity-quota.sh on
fi
}
-setup() {
- # create local test group
- GRP="`cat /etc/group | grep "$TSTUSR" | awk -F: '{print $1}'`"
- if [ -z "$GRP" ]; then
- groupadd -g $TSTID "$TSTUSR"
- fi
- TSTID="`cat /etc/group | grep "$TSTUSR" | awk -F: '{print $3}'`"
+RUNAS="runas -u $TSTID"
+RUNAS2="runas -u $TSTID2"
+FAIL_ON_ERROR=true check_runas_id $TSTID $RUNAS
+FAIL_ON_ERROR=true check_runas_id $TSTID2 $RUNAS2
- # create test user
- USR="`cat /etc/passwd | grep "$TSTUSR" | awk -F: '{print $1}'`"
- if [ -z "$USR" ]; then
- useradd -u $TSTID -g $TSTID -d /tmp "$TSTUSR"
- fi
-
- RUNAS="runas -u $TSTID"
-
- # create test directory
- [ -d $TSTDIR ] || mkdir $TSTDIR
- chmod 777 $TSTDIR
-}
-setup
+FAIL_ON_ERROR=false
# set quota
test_0() {
- $LFS quotaoff -ug $MOUNT
- $LFS quotacheck -ug $MOUNT
+ $LFS quotaoff -ug $DIR
+ $LFS quotacheck -ug $DIR
- $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
- $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
+ $LFS setquota -u $TSTUSR 0 0 0 0 $DIR
+ $LFS setquota -g $TSTUSR 0 0 0 0 $DIR
}
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
- TESTFILE="$TSTDIR/quota_tst10"
+ mkdir -p $DIR/$tdir
+ chmod 0777 $DIR/$tdir
+
+ LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 5)) # 5 bunits each sever
+ TESTFILE=$DIR/$tdir/$tfile-0
- echo " User quota (limit: $LIMIT bytes)"
- $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $MOUNT
+ echo " User quota (limit: $LIMIT kbytes)"
+ $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $DIR
+ $SHOW_QUOTA_USER
- $LFS setstripe $TESTFILE 65536 0 1
+ $LFS setstripe $TESTFILE -c 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)"
- $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT # clear user limit
- $LFS setquota -g $TSTUSR 0 $LIMIT 0 0 $MOUNT
- TESTFILE="$TSTDIR/quota_tst11"
+ echo " Group quota (limit: $LIMIT kbytes)"
+ $LFS setquota -u $TSTUSR 0 0 0 0 $DIR # clear user limit
+ $LFS setquota -g $TSTUSR 0 $LIMIT 0 0 $DIR
+ $SHOW_QUOTA_GROUP
+ TESTFILE=$DIR/$tdir/$tfile-1
- $LFS setstripe $TESTFILE 65536 0 1
+ $LFS setstripe $TESTFILE -c 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
- $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
+ $LFS setquota -g $TSTUSR 0 0 0 0 $DIR
}
run_test 1 "Block hard limit (normal use and out of quota) ==="
# file hard limit (normal use and out of quota)
test_2() {
+ mkdir -p $DIR/$tdir
+ chmod 0777 $DIR/$tdir
+
LIMIT=$(($IUNIT_SZ * 10)) # 10 iunits on mds
- TESTFILE="$TSTDIR/quota_tstr20"
+ TESTFILE=$DIR/$tdir/$tfile-0
echo " User quota (limit: $LIMIT files)"
- $LFS setquota -u $TSTUSR 0 0 0 $LIMIT $MOUNT
+ $LFS setquota -u $TSTUSR 0 0 0 $LIMIT $DIR
+ $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 expect 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
- TESTFILE="$TSTDIR/quota_tst21"
+ $LFS setquota -u $TSTUSR 0 0 0 0 $DIR # clear user limit
+ $LFS setquota -g $TSTUSR 0 0 0 $LIMIT $DIR
+ $SHOW_QUOTA_GROUP
+ TESTFILE=$DIR/$tdir/$tfile-1
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
- $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
+ unlinkmany ${TESTFILE} $LIMIT
+ rm ${TESTFILE}_xxx
+
+ $LFS setquota -g $TSTUSR 0 0 0 0 $DIR
}
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
# block soft limit (start timer, timer goes off, stop timer)
test_3() {
+ mkdir -p $DIR/$tdir
+ chmod 0777 $DIR/$tdir
+
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)"
- TESTFILE="$TSTDIR/quota_tst30"
- $LFS setstripe $TESTFILE 65536 0 1
+ echo " User quota (soft limit: $LIMIT kbytes grace: $GRACE seconds)"
+ TESTFILE=$DIR/$tdir/$tfile-0
+
+ $LFS setstripe $TESTFILE -c 1
chown $TSTUSR.$TSTUSR $TESTFILE
- $LFS setquota -t -u $GRACE $MAX_IQ_TIME $MOUNT
- $LFS setquota -u $TSTUSR $LIMIT 0 0 0 $MOUNT
+ $LFS setquota -t -u $GRACE $MAX_IQ_TIME $DIR
+ $LFS setquota -u $TSTUSR $LIMIT 0 0 0 $DIR
test_block_soft $TESTFILE $GRACE
- $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
+ $LFS setquota -u $TSTUSR 0 0 0 0 $DIR
+
+ echo " Group quota (soft limit: $LIMIT kbytes grace: $GRACE seconds)"
+ TESTFILE=$DIR/$tdir/$tfile-1
- echo " Group quota (soft limit: $LIMIT bytes grace: $GRACE seconds)"
- TESTFILE="$TSTDIR/quota_tst31"
- $LFS setstripe $TESTFILE 65536 0 1
+ $LFS setstripe $TESTFILE -c 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"
+ $LFS setquota -t -g $GRACE $MAX_IQ_TIME $DIR
+ $LFS setquota -g $TSTUSR $LIMIT 0 0 0 $DIR
test_block_soft $TESTFILE $GRACE
- $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
+ $LFS setquota -g $TSTUSR 0 0 0 0 $DIR
}
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"
+ sync; sleep 1; sync
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"
+ 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 " 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"
+ sync; sleep 1; sync
+ $RUNAS touch ${TESTFILE}_after && \
+ error "create after timer expired, but expect EDQUOT"
+ sync; sleep 1; sync
+
+ $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"
+ sync; sleep 1; sync
echo " Done"
# cleanup
}
# file soft limit (start timer, timer goes off, stop timer)
-test_4() {
+test_4a() { # was test_4
+ mkdir -p $DIR/$tdir
+ chmod 0777 $DIR/$tdir
LIMIT=$(($IUNIT_SZ * 10)) # 10 iunits on mds
- TESTFILE="$TSTDIR/quota_tst40"
+ TESTFILE=$DIR/$tdir/$tfile-0
+
GRACE=5
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
+ $LFS setquota -t -u $MAX_DQ_TIME $GRACE $DIR
+ $LFS setquota -u $TSTUSR 0 0 $LIMIT 0 $DIR
+ $SHOW_QUOTA_USER
test_file_soft $TESTFILE $LIMIT $GRACE
- $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
+ $LFS setquota -u $TSTUSR 0 0 0 0 $DIR
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
- TESTFILE="$TSTDIR/quota_tst41"
+ $LFS setquota -t -g $MAX_DQ_TIME $GRACE $DIR
+ $LFS setquota -g $TSTUSR 0 0 $LIMIT 0 $DIR
+ $SHOW_QUOTA_GROUP
+ TESTFILE=$DIR/$tdir/$tfile-1
test_file_soft $TESTFILE $LIMIT $GRACE
- $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
-
+ $LFS setquota -g $TSTUSR 0 0 0 0 $DIR
+
# cleanup
- $LFS setquota -t -u $MAX_DQ_TIME $MAX_IQ_TIME $MOUNT
- $LFS setquota -t -g $MAX_DQ_TIME $MAX_IQ_TIME $MOUNT
+ $LFS setquota -t -u $MAX_DQ_TIME $MAX_IQ_TIME $DIR
+ $LFS setquota -t -g $MAX_DQ_TIME $MAX_IQ_TIME $DIR
+}
+run_test 4a "File soft limit (start timer, timer goes off, stop timer) ==="
+
+test_4b() { # was test_4a
+ GR_STR1="1w3d"
+ GR_STR2="1000s"
+ GR_STR3="5s"
+ GR_STR4="1w2d3h4m5s"
+ GR_STR5="5c"
+ GR_STR6="1111111111111111"
+
+ # test of valid grace strings handling
+ echo " Valid grace strings test"
+ $LFS setquota -t -u $GR_STR1 $GR_STR2 $DIR
+ $LFS quota -u -t $DIR | grep "Block grace time: $GR_STR1"
+ $LFS setquota -t -g $GR_STR3 $GR_STR4 $DIR
+ $LFS quota -g -t $DIR | grep "Inode grace time: $GR_STR4"
+
+ # test of invalid grace strings handling
+ echo " Invalid grace strings test"
+ ! $LFS setquota -t -u $GR_STR4 $GR_STR5 $DIR
+ ! $LFS setquota -t -g $GR_STR4 $GR_STR6 $DIR
+
+ # cleanup
+ $LFS setquota -t -u $MAX_DQ_TIME $MAX_IQ_TIME $DIR
+ $LFS setquota -t -g $MAX_DQ_TIME $MAX_IQ_TIME $DIR
}
-run_test 4 "File soft limit (start timer, timer goes off, stop timer) ==="
+run_test 4b "Grace time strings handling ==="
# chown & chgrp (chown & chgrp successfully even out of block/file quota)
test_5() {
+ mkdir -p $DIR/$tdir
BLIMIT=$(( $BUNIT_SZ * $((OSTCOUNT + 1)) * 10)) # 10 bunits on each server
ILIMIT=$(( $IUNIT_SZ * 10 )) # 10 iunits on mds
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
+ $LFS setquota -u $TSTUSR 0 $BLIMIT 0 $ILIMIT $DIR
+ $LFS setquota -g $TSTUSR 0 $BLIMIT 0 $ILIMIT $DIR
+ $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 $DIR/$tdir/$tfile-0_ $((ILIMIT + 1)) || \
+ error "touch failure, expect success"
+ dd if=/dev/zero of=$DIR/$tdir/$tfile-0_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 $DIR/$tdir/$tfile-0_$i || \
+ error "chown failure, but expect success"
done
# cleanup
- for i in `seq $(($ILIMIT + 1))`; do
- rm -f $TSTDIR/quota_tst50_$i
- done
- $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
- $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
+ unlinkmany $DIR/$tdir/$tfile-0_ $((ILIMIT + 1))
+
+ $LFS setquota -u $TSTUSR 0 0 0 0 $DIR
+ $LFS setquota -g $TSTUSR 0 0 0 0 $DIR
}
-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() {
if [ $OSTCOUNT -lt 2 ]; then
- echo "WARN: too few osts, skip this test."
+ skip "$OSTCOUNT < 2, too few osts"
return 0;
fi
- LIMIT=$(($BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits per server
- FILEA="$TSTDIR/quota_tst60_a"
- FILEB="$TSTDIR/quota_tst60_b"
+ mkdir -p $DIR/$tdir
+ chmod 0777 $DIR/$tdir
+
+ LIMIT=$((BUNIT_SZ * (OSTCOUNT + 1) * 5)) # 5 bunits per server
+ FILEA="$DIR/$tdir/$tfile-0_a"
+ FILEB="$DIR/$tdir/$tfile-0_b"
- echo " Set block limit $LIMIT bytes to $TSTUSR.$TSTUSR"
- $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $MOUNT
- $LFS setquota -g $TSTUSR 0 $LIMIT 0 0 $MOUNT
+ echo " Set block limit $LIMIT kbytes to $TSTUSR.$TSTUSR"
+ $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $DIR
+ $LFS setquota -g $TSTUSR 0 $LIMIT 0 0 $DIR
+ $SHOW_QUOTA_USER
+ $SHOW_QUOTA_GROUP
echo " Create filea on OST0 and fileb on OST1"
- $LFS setstripe $FILEA 65536 0 1
- $LFS setstripe $FILEB 65536 1 1
+ $LFS setstripe $FILEA -i 0 -c 1
+ $LFS setstripe $FILEB -i 1 -c 1
chown $TSTUSR.$TSTUSR $FILEA
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
rm -f $FILEA
- $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
- $LFS setquota -g $TSTUSR 0 0 0 0 $MOUNT
+ $LFS setquota -u $TSTUSR 0 0 0 0 $DIR
+ $LFS setquota -g $TSTUSR 0 0 0 0 $DIR
return 0
}
run_test 6 "Block quota acquire & release ========="
# quota recovery (block quota only by now)
test_7()
{
- if [ -z "`lsmod|grep mds`" ]; then
- echo "WARN: no local mds, skip this test"
- return 0
- fi
+ mkdir -p $DIR/$tdir
+ chmod 0777 $DIR/$tdir
LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits each sever
- TESTFILE="$TSTDIR/quota_tst70"
+ TESTFILE="$DIR/$tdir/$tfile-0"
- $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $MOUNT
+ $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $DIR
- $LFS setstripe $TESTFILE 65536 0 1
+ $LFS setstripe $TESTFILE -c 1
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
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
sleep 20
# check limits
- PATTERN="`echo $MOUNT | sed 's/\//\\\\\//g'`"
- TOTAL_LIMIT="`$LFS quota -u $TSTUSR $MOUNT | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $4 }'`"
+ PATTERN="`echo $DIR | sed 's/\//\\\\\//g'`"
+ TOTAL_LIMIT="`$LFS quota -u $TSTUSR $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $4 }'`"
[ $TOTAL_LIMIT -eq $LIMIT ] || error "total limits not recovery!"
echo " total limits = $TOTAL_LIMIT"
- OST0_UUID=`$LCTL dl | awk '$3 ~ /obdfilter/ { print $5 }'| head -n1`
- [ -z "$OST0_UUID" ] && OST0_UUID=`$LCTL dl | awk '$3 ~ /obdfilter/ { print $5 }'|head -n1`
- OST0_LIMIT="`$LFS quota -o $OST0_UUID -u $TSTUSR $MOUNT | awk '/^.*[[:digit:]+][[:space:]+]/ { print $3 }'`"
+ OST0_UUID=`do_facet ost1 "$LCTL dl | grep -m1 obdfilter" | awk '{print $((NF-1))}'`
+ [ -z "$OST0_UUID" ] && OST0_UUID=`do_facet ost1 "$LCTL dl | grep -m1 obdfilter" | awk '{print $((NF-1))}'`
+ OST0_LIMIT="`$LFS quota -o $OST0_UUID -u $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $3 }'`"
[ $OST0_LIMIT -eq $BUNIT_SZ ] || error "high limits not released!"
echo " limits on $OST0_UUID = $OST0_LIMIT"
# cleanup
- $LFS setquota -u $TSTUSR 0 0 0 0 $MOUNT
+ $LFS setquota -u $TSTUSR 0 0 0 0 $DIR
}
run_test 7 "Quota recovery (only block limit) ======"
# run dbench with quota enabled
test_8() {
+ mkdir -p $DIR/$tdir
BLK_LIMIT=$((100 * 1024 * 1024)) # 100G
FILE_LIMIT=1000000
- DBENCH_LIB=${DBENCH_LIB:-/usr/lib/dbench}
-
- [ ! -d $DBENCH_LIB ] && echo "dbench not installed, skip this test" && return 0
-
+
+ wait_delete_completed
+
echo " Set enough high limit for user: $TSTUSR"
- $LFS setquota -u $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT
+ $LFS setquota -u $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $DIR
echo " Set enough high limit for group: $TSTUSR"
- $LFS setquota -g $USER 0 $BLK_LIMIT 0 $FILE_LIMIT $MOUNT
-
+ $LFS setquota -g $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $DIR
- TGT=$TSTDIR/client.txt
- SRC=${SRC:-$DBENCH_LIB/client.txt}
- [ ! -e $TGT -a -e $SRC ] && echo "copying $SRC to $TGT" && cp $SRC $TGT
- SRC=$DBENCH_LIB/client_plain.txt
- [ ! -e $TGT -a -e $SRC ] && echo "copying $SRC to $TGT" && cp $SRC $TGT
+ chmod 0777 $DIR/$tdir
+ local duration=""
+ [ "$SLOW" = "no" ] && duration=" -t 120"
+ $RUNAS bash rundbench -D $DIR/$tdir 3 $duration || error "dbench failed!"
- SAVE_PWD=$PWD
- cd $TSTDIR
- $RUNAS dbench -c client.txt 3
- RC=$?
-
- cd $SAVE_PWD
- return $RC
+ sync; sleep 3; sync;
+
+ return 0
}
run_test 8 "Run dbench with quota enabled ==========="
# run for fixing bug10707, it needs a big room. test for 64bit
+KB=1024
+GB=$((KB * 1024 * 1024))
+FSIZE=$((OSTCOUNT * 9 / 2))
+# Use this as dd bs to decrease time
+# inode->i_blkbits = min(PTLRPC_MAX_BRW_BITS+1, LL_MAX_BLKSIZE_BITS);
+blksize=$((1 << 21)) # 2Mb
+
test_9() {
- lustrefs_size=`df | grep $MOUNT | awk '{print $(NF - 2)}'`
- 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;
+ chmod 0777 $DIR/$tdir
+ lustrefs_size=`(echo 0; df -t lustre -P | awk '{print $4}') | tail -n 1`
+ size_file=$((FSIZE * GB))
+ echo "lustrefs_size:$lustrefs_size size_file:$((size_file / KB))"
+ if [ $((lustrefs_size * KB)) -lt $size_file ]; then
+ skip "less than $size_file bytes free"
+ return 0;
fi
+ set_blk_unitsz $((1024 * 100))
+ set_blk_tunesz $((1024 * 50))
+
# set the D_QUOTA flag
- DBG_SAVE="`sysctl -n lnet.debug`"
- sysctl -w lnet.debug="$DBG_SAVE quota"
+ debugsave
+ sysctl -w lnet.debug="+quota"
- TESTFILE="$TSTDIR/quota_tst90"
+ TESTFILE="$DIR/$tdir/$tfile-0"
- echo " Set block limit $LIMIT bytes to $TSTUSR.$TSTUSR"
- BLK_LIMIT=$((100 * 1024 * 1024)) # 100G
+ BLK_LIMIT=$((100 * KB * KB)) # 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(block:$BLK_LIMIT; file: $FILE_LIMIT) for user: $TSTUSR"
+ $LFS setquota -u $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $DIR
+ echo " Set enough high limit(block:$BLK_LIMIT; file: $FILE_LIMIT) for group: $TSTUSR"
+ $LFS setquota -g $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $DIR
echo " Set stripe"
- [ $OSTCOUNT -ge 2 ] && $LFS setstripe $TESTFILE 65536 0 $OSTCOUNT
+ [ $OSTCOUNT -ge 2 ] && $LFS setstripe $TESTFILE -c $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 >/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 >/dev/null 2>&1
+ $SHOW_QUOTA_USER
+ $SHOW_QUOTA_GROUP
+
+ echo " Write the big file of $FSIZE G ..."
+ $RUNAS dd if=/dev/zero of=$TESTFILE bs=$blksize count=$((size_file / blksize)) || \
+ error "(usr) write $FSIZE G file failure, but expect success"
+
+ $SHOW_QUOTA_USER
+ $SHOW_QUOTA_GROUP
+
+ echo " delete the big file of $FSIZE G..."
+ $RUNAS rm -f $TESTFILE
+
+ $SHOW_QUOTA_USER
+ $SHOW_QUOTA_GROUP
- 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"
+ echo " write the big file of 2 G..."
+ $RUNAS dd if=/dev/zero of=$TESTFILE bs=$blksize count=$((2 * GB / blksize)) || \
+ error "(usr) write 2 G file failure, but expect seccess"
- echo " delete the big file of 2G..."
- $RUNAS rm -f $TESTFILE >/dev/null 2>&1
+ echo " delete the big file of 2 G..."
+ $RUNAS rm -f $TESTFILE
RC=$?
- sysctl -w lnet.debug="$DBG_SAVE"
+ set_blk_tunesz $BTUNE_SZ
+ set_blk_unitsz $BUNIT_SZ
+
+ debugrestore
+ wait_delete_completed
+
return $RC
}
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)}'`
- 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
+ mkdir -p $DIR/$tdir
+ chmod 0777 $DIR/$tdir
+ lustrefs_size=`(echo 0; df -t lustre -P | awk '{print $4}') | tail -n 1`
+ size_file=$((FSIZE * GB))
+ echo "lustrefs_size:$lustrefs_size size_file:$((size_file / KB))"
+ if [ $((lustrefs_size * KB)) -lt $size_file ]; then
+ skip "less than $size_file bytes free"
+ 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
+ sync; sleep 10; sync;
+
+ set_blk_unitsz $((1024 * 100))
+ set_blk_tunesz $((1024 * 50))
+
+ # set the D_QUOTA flag
+ debugsave
+ sysctl -w lnet.debug="+quota"
+
+ # make qd_count 32 bit
+ sysctl -w lustre.fail_loc=0xA00
- sync; sleep 10; sync;
+ TESTFILE="$DIR/$tdir/$tfile-0"
- # set the D_QUOTA flag
- DBG_SAVE="`sysctl -n lnet.debug`"
- sysctl -w lnet.debug="$DBG_SAVE quota"
+ BLK_LIMIT=$((100 * KB * KB)) # 100G
+ FILE_LIMIT=1000000
- # make qd_count 32 bit
- sysctl -w lustre.fail_loc=2560
+ echo " Set enough high limit(block:$BLK_LIMIT; file: $FILE_LIMIT) for user: $TSTUSR"
+ $LFS setquota -u $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $DIR
+ echo " Set enough high limit(block:$BLK_LIMIT; file: $FILE_LIMIT) for group: $TSTUSR"
+ $LFS setquota -g $TSTUSR 0 $BLK_LIMIT 0 $FILE_LIMIT $DIR
+
+ echo " Set stripe"
+ [ $OSTCOUNT -ge 2 ] && $LFS setstripe $TESTFILE -c $OSTCOUNT
+ touch $TESTFILE
+ chown $TSTUSR.$TSTUSR $TESTFILE
- TESTFILE="$TSTDIR/quota_tst100"
+ $SHOW_QUOTA_USER
+ $SHOW_QUOTA_GROUP
- echo " Set block limit $LIMIT bytes to $TSTUSR.$TSTUSR"
- BLK_LIMIT=$((100 * 1024 * 1024)) # 100G
- FILE_LIMIT=1000000
+ echo " Write the big file of $FSIZE G ..."
+ $RUNAS dd if=/dev/zero of=$TESTFILE bs=$blksize count=$((size_file / blksize)) || \
+ error "(usr) write $FSIZE G file failure, but expect success"
+
+ $SHOW_QUOTA_USER
+ $SHOW_QUOTA_GROUP
- 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 " delete the big file of $FSIZE G..."
+ $RUNAS rm -f $TESTFILE
- echo " Set stripe"
- [ $OSTCOUNT -ge 2 ] && $LFS setstripe $TESTFILE 65536 0 $OSTCOUNT
- touch $TESTFILE
- chown $TSTUSR.$TSTUSR $TESTFILE
+ $SHOW_QUOTA_USER
+ $SHOW_QUOTA_GROUP
- 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 " write the big file of 2 G..."
+ $RUNAS dd if=/dev/zero of=$TESTFILE bs=$blksize count=$((2 * GB / blkzise)) || \
+ error "(usr) write 2 G file failure, but expect success"
- echo " delete the big file of $(($OSTCOUNT * 9 / 2))G..."
- $RUNAS rm -f $TESTFILE >/dev/null 2>&1
+ echo " delete the big file of 2 G..."
+ $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 success"
+ RC=$?
- echo " delete the big file of 2G..."
- $RUNAS rm -f $TESTFILE >/dev/null 2>&1
- RC=$?
+ # clear the flage
+ debugrestore
- sysctl -w lnet.debug="$DBG_SAVE"
+ # make qd_count 64 bit
+ sysctl -w lustre.fail_loc=0
- # make qd_count 64 bit
- sysctl -w lustre.fail_loc=0
+ set_blk_tunesz $BTUNE_SZ
+ set_blk_unitsz $BUNIT_SZ
- return $RC
+ wait_delete_completed
+
+ return $RC
}
run_test 10 "run for fixing bug10707(32bit) ==========="
test_11() {
+ wait_delete_completed
+
#prepare the test
- block_limit=`df | grep $MOUNT | awk '{print $(NF - 4)}'`
+ 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`
echo 30 > /proc/sys/vm/dirty_expire_centisecs
echo 1 > /proc/sys/vm/dirty_ratio
echo 50 > /proc/sys/vm/dirty_writeback_centisecs
- TESTDIR="$TSTDIR/quota_tst110"
+ TESTDIR="$DIR/$tdir"
+ local RV=0
#do the test
- MINS=0
- REPS=3
- i=1
+ local SECS=0
+ local REPS=3
+ [ "$SLOW" = no ] && REPS=1
+ local sleep=20
+ local i=1
while [ $i -le $REPS ]; do
echo "test: cycle($i of $REPS) start at $(date)"
mkdir -p $TESTDIR && chmod 777 $TESTDIR
echo -n " create a file for uid "
for j in `seq 1 30`; do
echo -n "$j "
- runas -u $j dd if=/dev/zero of=$TESTDIR/$j bs=$BLK_SZ > /dev/null 2>&1 &
+ # 30MB per dd for a total of 900MB (if space even permits)
+ runas -u $j dd if=/dev/zero of=$TESTDIR/$tfile bs=$blksize count=15 > /dev/null 2>&1 &
done
echo ""
- PROCS=$(ps -e | grep dd | wc -l)
+ PROCS=$(ps -ef | grep -v grep | grep "dd if /dev/zero of $TESTDIR" | wc -l)
+ LAST_USED=0
while [ $PROCS -gt 0 ]; do
- sleep 60
- MINS=$(($MINS+1))
- PROCS=$(ps -e | grep dd | wc -l)
+ sleep 20
+ SECS=$((SECS + sleep))
+ PROCS=$(ps -ef | grep -v grep | grep "dd if /dev/zero of $TESTDIR" | wc -l)
USED=$(du -s $TESTDIR | awk '{print $1}')
PCT=$(($USED * 100 / $block_limit))
- echo "${i}/${REPS} ${PCT}% p${PROCS} t${MINS} "
+ echo "${i}/${REPS} ${PCT}% p${PROCS} t${SECS} "
+ if [ $USED -le $LAST_USED ]; then
+ kill -9 $(ps -ef | grep "dd if /dev/zero of $TESTDIR" | grep -v grep | awk '{ print $2 }')
+ i=$REPS
+ RV=2
+ break
+ fi
+ LAST_USED=$USED
done
echo " removing the test files..."
- rm -rf $TESTDIR
+ rm -f $TESTDIR/$tfile
echo "cycle $i done at $(date)"
i=$[$i+1]
done
- echo "Test took $MINS minutes"
+ echo "Test took $SECS sec"
#clean
echo $orig_dbr > /proc/sys/vm/dirty_background_ratio
echo $orig_dec > /proc/sys/vm/dirty_expire_centisecs
echo $orig_dr > /proc/sys/vm/dirty_ratio
echo $orig_dwc > /proc/sys/vm/dirty_writeback_centisecs
+ if [ $RV -ne 0 ]; then
+ error "Nothing was written for $SECS sec ... aborting"
+ fi
+ return $RV
}
run_test 11 "run for fixing bug10912 ==========="
+
+# test a deadlock between quota and journal b=11693
+test_12() {
+ mkdir -p $DIR/$tdir
+ chmod 0777 $DIR/$tdir
+
+ [ "$(grep $DIR2 /proc/mounts)" ] || mount_client $DIR2 || \
+ { skip "Need lustre mounted on $MOUNT2 " && retutn 0; }
+
+ LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits each sever
+ TESTFILE="$DIR/$tdir/$tfile-0"
+ TESTFILE2="$DIR2/$tdir/$tfile-1"
+
+ echo " User quota (limit: $LIMIT kbytes)"
+ $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $DIR
+
+ $LFS setstripe $TESTFILE -i 0 -c 1
+ chown $TSTUSR.$TSTUSR $TESTFILE
+ $LFS setstripe $TESTFILE2 -i 0 -c 1
+ chown $TSTUSR2.$TSTUSR2 $TESTFILE2
+
+ #define OBD_FAIL_OST_HOLD_WRITE_RPC 0x21f
+ 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)) &
+ DDPID=$!
+ sleep 5
+ $RUNAS2 dd if=/dev/zero of=$TESTFILE2 bs=$BLK_SZ count=102400 &
+ DDPID1=$!
+
+ echo " step2: testing ......"
+ count=0
+ while [ true ]; do
+ if [ -z `ps -ef | awk '$2 == '${DDPID1}' { print $8 }'` ]; then break; fi
+ count=$[count+1]
+ if [ $count -gt 64 ]; then
+ sysctl -w lustre.fail_loc=0
+ error "dd should be finished!"
+ fi
+ sleep 1
+ done
+ echo "(dd_pid=$DDPID1, time=$count)successful"
+
+ #Recover fail_loc and dd will finish soon
+ sysctl -w lustre.fail_loc=0
+
+ echo " step3: testing ......"
+ count=0
+ while [ true ]; do
+ if [ -z `ps -ef | awk '$2 == '${DDPID}' { print $8 }'` ]; then break; fi
+ count=$[count+1]
+ if [ $count -gt 100 ]; then
+ error "dd should be finished!"
+ fi
+ sleep 1
+ done
+ echo "(dd_pid=$DDPID, time=$count)successful"
+
+ rm -f $TESTFILE $TESTFILE2
+
+ $LFS setquota -u $TSTUSR 0 0 0 0 $DIR # clear user limit
+}
+run_test 12 "test a deadlock between quota and journal ==="
+
+# test multiple clients write block quota b=11693
+test_13() {
+ # one OST * 10 + (mds + other OSTs)
+ LIMIT=$((BUNIT_SZ * 10 + (BUNIT_SZ * OSTCOUNT)))
+ TESTFILE="$DIR/$tdir/$tfile"
+ mkdir -p $DIR/$tdir
+
+ echo " User quota (limit: $LIMIT kbytes)"
+ $LFS setquota -u $TSTUSR 0 $LIMIT 0 0 $DIR
+ $SHOW_QUOTA_USER
+
+ $LFS setstripe $TESTFILE -i 0 -c 1
+ chown $TSTUSR.$TSTUSR $TESTFILE
+ $LFS setstripe $TESTFILE.2 -i 0 -c 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] &
+ DDPID=$!
+ $RUNAS dd if=/dev/zero of=$TESTFILE.2 bs=$BLK_SZ count=$[($LIMIT - $BUNIT_SZ) / 2] &
+ DDPID1=$!
+
+ echo " step2: testing ......"
+ count=0
+ while [ true ]; do
+ if [ -z `ps -ef | awk '$2 == '${DDPID}' { print $8 }'` ]; then break; fi
+ count=$[count+1]
+ if [ $count -gt 64 ]; then
+ error "dd should be finished!"
+ fi
+ sleep 1
+ done
+ echo "(dd_pid=$DDPID, time=$count)successful"
+
+ count=0
+ while [ true ]; do
+ if [ -z `ps -ef | awk '$2 == '${DDPID1}' { print $8 }'` ]; then break; fi
+ count=$[count+1]
+ if [ $count -gt 64 ]; then
+ error "dd should be finished!"
+ fi
+ sleep 1
+ done
+ echo "(dd_pid=$DDPID1, time=$count)successful"
+
+ sync; sleep 5; sync;
+
+ echo " step3: checking ......"
+ 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 + $fz2 < $((BUNIT_SZ * BLK_SZ * 10))"
+
+ rm -f $TESTFILE $TESTFILE.2
+
+ $LFS setquota -u $TSTUSR 0 0 0 0 $DIR # clear user limit
+}
+run_test 13 "test multiple clients write block quota ==="
+
+check_if_quota_zero(){
+ line=`$LFS quota -$1 $2 $DIR | wc -l`
+ for i in `seq 3 $line`; do
+ if [ $i -eq 3 ]; then
+ field="3 4 6 7"
+ else
+ field="3 5"
+ fi
+ for j in $field; do
+ tmp=`$LFS quota -$1 $2 $DIR | sed -n ${i}p |
+ awk '{print $'"$j"'}'`
+ [ -n "$tmp" ] && [ $tmp -ne 0 ] && $LFS quota -$1 $2 $DIR && \
+ error "quota on $2 isn't clean"
+ done
+ done
+ echo "pass check_if_quota_zero"
+}
+
+pre_test_14 () {
+ # reboot the lustre
+ cd $T_PWD; sh llmountcleanup.sh || error "llmountcleanup failed"
+ sh llmount.sh
+ pre_test
+ run_test 0 "reboot lustre"
+}
+
+pre_test_14
+
+test_14a() { # was test_14 b=12223 -- setting quota on root
+ TESTFILE="$DIR/$tdir/$tfile"
+ mkdir -p $DIR/$tdir
+
+ # out of root's file and block quota
+ $LFS setquota -u root 10 10 10 10 $DIR
+ createmany -m ${TESTFILE} 20 || \
+ error "unexpected: user(root) create files failly!"
+ dd if=/dev/zero of=$TESTFILE bs=4k count=4096 || \
+ error "unexpected: user(root) write files failly!"
+ chmod 666 $TESTFILE
+ $RUNAS dd if=/dev/zero of=${TESTFILE} seek=4096 bs=4k count=4096 && \
+ error "unexpected: user(quota_usr) write a file successfully!"
+
+ # trigger the llog
+ chmod 777 $DIR
+ for i in `seq 1 10`; do $RUNAS touch ${TESTFILE}a_$i; done
+ for i in `seq 1 10`; do $RUNAS rm -f ${TESTFILE}a_$i; done
+
+ # do the check
+ dmesg | tail | grep "\-122" |grep llog_obd_origin_add && error "err -122 not found in dmesg"
+ $LFS setquota -u root 0 0 0 0 $DIR
+ #check_if_quota_zero u root
+
+ # clean
+ unlinkmany ${TESTFILE} 15
+ rm -f $TESTFILE
+}
+run_test 14a "test setting quota on root ==="
+
# turn off quota
test_99()
{
- $LFS quotaoff $MOUNT
+ $LFS quotaoff $DIR
return 0
}
run_test 99 "Quota off ==============================="
log "cleanup: ======================================================"
-if [ "`mount | grep ^$NAME`" ]; then
- rm -fr $TSTDIR
- post_test
- # delete test user and group
- userdel "$TSTUSR"
- if [ "$I_MOUNTED" = "yes" ]; then
- cd $ORIG_PWD && (sh llmountcleanup.sh || error "llmountcleanup failed")
- fi
-fi
-
+cd $ORIG_PWD
+post_test
+check_and_cleanup_lustre
echo '=========================== finished ==============================='
-[ -f "$SANITYLOG" ] && cat $SANITYLOG && exit 1 || true
+[ -f "$QUOTALOG" ] && cat $QUOTALOG && grep -q FAIL $QUOTALOG && exit 1 || true
echo "$0: completed"