MAX_DQ_TIME=604800
MAX_IQ_TIME=604800
+unset ENABLE_QUOTA
+
TRACE=${TRACE:-""}
LUSTRE=${LUSTRE:-`dirname $0`/..}
. $LUSTRE/tests/test-framework.sh
SHOW_QUOTA_USER2="$LFS quota -v -u $TSTUSR2 $DIR"
SHOW_QUOTA_GROUP="$LFS quota -v -g $TSTUSR $DIR"
SHOW_QUOTA_GROUP2="$LFS quota -v -g $TSTUSR2 $DIR"
-SHOW_QUOTA_INFO="$LFS quota -t $DIR"
+SHOW_QUOTA_INFO="$LFS quota -t -u $DIR; $LFS quota -t -g $DIR"
# control the time of tests
cycle=30
# resetquota -g groupname
resetquota() {
- [ "$#" != 2 ] && error "resetquota: wrong number of arguments: $#"
- [ "$1" != "-u" -a "$1" != "-g" ] && error "resetquota: wrong specifier $1 passed"
- $LFS setquota "$1" "$2" -b 0 -B 0 -i 0 -I 0 $MOUNT || error "resetquota failed"
+ [ "$#" != 2 ] && error "resetquota: wrong number of arguments: $#"
+ [ "$1" != "-u" -a "$1" != "-g" ] && error "resetquota: wrong specifier $1 passed"
+
+ count=0
+ if at_is_valid && at_is_enabled; then
+ timeout=$(at_max_get mds)
+ else
+ timeout=$(lctl get_param -n timeout)
+ fi
+
+ while [ $((count++)) -lt $timeout ]; do
+ $LFS setquota "$1" "$2" -b 0 -B 0 -i 0 -I 0 $MOUNT
+ RC=$?
+ if [ $RC -ne 0 ]; then
+ if [ $RC -eq 240 ]; then # 240 means -EBUSY
+ log "resetquota is blocked for quota master recovery, retry after 1 sec"
+ sleep 1
+ continue
+ else
+ error "resetquota failed: $RC"
+ fi
+ fi
+ break
+ done
+
+ [ $count -lt $timeout ] || error "resetquota timeout: $timeout"
}
quota_scan() {
if [ "$LOCAL_BF" == "a" -o "$LOCAL_BF" == "b" ]; then
USAGE="`$LFS quota -$LOCAL_UG $LOCAL_ID $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $2 }'`"
- [ $USAGE -ne 0 ] && quota_log $LOCAL_UG $LOCAL_ID "System is not clean for block ($LOCAL_UG:$LOCAL_ID:$USAGE)."
+ if [ -z $USAGE ]; then
+ quota_error $LOCAL_UG $LOCAL_ID "System is error when query quota for block ($LOCAL_UG:$LOCAL_ID)."
+ else
+ [ $USAGE -ne 0 ] && quota_log $LOCAL_UG $LOCAL_ID "System is not clean for block ($LOCAL_UG:$LOCAL_ID:$USAGE)."
+ fi
fi
if [ "$LOCAL_BF" == "a" -o "$LOCAL_BF" == "f" ]; then
USAGE="`$LFS quota -$LOCAL_UG $LOCAL_ID $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $5 }'`"
- [ $USAGE -ne 0 ] && quota_log $LOCAL_UG $LOCAL_ID "System is not clean for file ($LOCAL_UG:$LOCAL_ID:$USAGE)."
+ if [ -z $USAGE ]; then
+ quota_error $LOCAL_UG $LOCAL_ID "System is error when query quota for file ($LOCAL_UG:$LOCAL_ID)."
+ else
+ [ $USAGE -ne 0 ] && quota_log $LOCAL_UG $LOCAL_ID "System is not clean for file ($LOCAL_UG:$LOCAL_ID:$USAGE)."
+ fi
fi
}
chown $TSTUSR.$TSTUSR $FILEB
echo " Exceed quota limit ..."
- RUNDD="$RUNAS dd if=/dev/zero of=$FILEB bs=$BLK_SZ"
+ RUNDD="$RUNAS dd if=/dev/zero of=$FILEA bs=$BLK_SZ"
$RUNDD count=$((LIMIT - BUNIT_SZ * OSTCOUNT)) || \
- quota_error a $TSTUSR "write fileb failure, but expect success"
+ quota_error a $TSTUSR "write filea failure, but expect success"
cancel_lru_locks osc
$SHOW_QUOTA_USER
$SHOW_QUOTA_GROUP
$RUNDD seek=$LIMIT count=$((BUNIT_SZ * OSTCOUNT)) && \
- quota_error a $TSTUSR "write fileb success, but expect EDQUOT"
+ quota_error a $TSTUSR "write filea success, but expect EDQUOT"
cancel_lru_locks osc
- echo " Write to OST0 return EDQUOT"
+ echo " Write to OST1 return EDQUOT"
# this write maybe cache write, ignore it's failure
- RUNDD="$RUNAS dd if=/dev/zero of=$FILEA bs=$BLK_SZ"
+ RUNDD="$RUNAS dd if=/dev/zero of=$FILEB bs=$BLK_SZ"
$RUNDD count=$(($BUNIT_SZ * 2)) || true
cancel_lru_locks osc
$SHOW_QUOTA_USER
$SHOW_QUOTA_GROUP
$RUNDD count=$((BUNIT_SZ * 2)) seek=$((BUNIT_SZ *2)) && \
- quota_error a $TSTUSR "write filea success, but expect EDQUOT"
+ quota_error a $TSTUSR "write fileb 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 " Remove filea to let OST0 release quota"
+ rm -f $FILEA
+
+ if at_is_valid && at_is_enabled; then
+ timeout=$(at_max_get mds)
+ else
+ timeout=$(lctl get_param -n timeout)
+ fi
+ count=$((timeout / 5))
+ OST0_UUID=`do_facet ost1 $LCTL dl | grep -m1 obdfilter | awk '{print $((NF-1))}'`
+
+ while [ $((count--)) -gt 0 ]; do
+ sync && sleep 5
+
+ OST0_QUOTA_HOLD=`$LFS quota -o $OST0_UUID -u $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $3 }'`
+ if [ -z $OST0_QUOTA_HOLD ]; then
+ error "System is error when query quota for block (U:$TSTUSR)."
+ else
+ [ $OST0_QUOTA_HOLD -gt $BUNIT_SZ ] && continue
+ fi
+
+ break
+ done
+
+ [ ! $count -gt 0 ] && error "Release quota for block timeout (U:$TSTUSR)."
+ $SHOW_QUOTA_USER
+
+ while [ $((count--)) -gt 0 ]; do
+ sync && sleep 5
- echo " Write to OST0"
+ OST0_QUOTA_HOLD=`$LFS quota -o $OST0_UUID -g $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $3 }'`
+ if [ -z $OST0_QUOTA_HOLD ]; then
+ error "System is error when query quota for block (G:$TSTUSR)."
+ else
+ [ $OST0_QUOTA_HOLD -gt $BUNIT_SZ ] && continue
+ fi
+
+ break
+ done
+
+ [ ! $count -gt 0 ] && error "Release quota for block timeout (G:$TSTUSR)."
+ $SHOW_QUOTA_GROUP
+
+ echo " Write to OST1"
$RUNDD count=$((LIMIT - BUNIT_SZ * OSTCOUNT)) || \
- quota_error a $TSTUSR "write filea failure, expect success"
+ quota_error a $TSTUSR "write fileb failure, expect success"
echo " Done"
# cleanup
- rm -f $FILEA
+ rm -f $FILEB
sync; sleep 3; sync;
resetquota -u $TSTUSR
}
run_test_with_stat 14a "test setting quota on root ==="
-# save quota version (both administrative and operational quotas)
-quota_save_version() {
- do_facet mgs "lctl conf_param ${FSNAME}-MDT*.mdd.quota_type=$1"
- do_facet mgs "lctl conf_param ${FSNAME}-OST*.ost.quota_type=$1"
- sleep 5
-}
-
test_15(){
LIMIT=$((24 * 1024 * 1024 * 1024 * 1024)) # 24 TB
PATTERN="`echo $DIR | sed 's/\//\\\\\//g'`"
sleep 1
done
log "(dd_pid=$DDPID, time=$count, timeout=$timeout)"
+ sync
+ cancel_lru_locks mdc
+ cancel_lru_locks osc
testfile_size=$(stat -c %s $TESTFILE)
[ $testfile_size -ne $((BLK_SZ * 1024 * 100)) ] && \
quota_error u $TSTUSR "expect $((BLK_SZ * 1024 * 100)), got ${testfile_size}. Verifying file failed!"
- rm -f $TESTFILE
- sync; sleep 3; sync;
+ $SHOW_QUOTA_USER
+ rm -f $TESTFILE
+ sync
resetquota -u $TSTUSR
-
set_blk_unitsz $((128 * 1024))
set_blk_tunesz $((128 * 1024 / 2))
}
log "(dd_pid=$DDPID, time=$count, timeout=$timeout)"
lustre_fail mds 0
-
rm -f $TESTFILE
- sync; sleep 3; sync;
+ sync
resetquota -u $TSTUSR
-
set_blk_unitsz $((128 * 1024))
set_blk_tunesz $((128 * 1024 / 2))
}
sleep 1
done
log "(dd_pid=$DDPID, time=$count, timeout=$timeout)"
- sync; sleep 1; sync
+ sync
+ cancel_lru_locks mdc
+ cancel_lru_locks osc
testfile_size=$(stat -c %s $TESTFILE)
[ $testfile_size -ne $((BLK_SZ * 1024 * 100)) ] && \
quota_error u $TSTUSR "expect $((BLK_SZ * 1024 * 100)), got ${testfile_size}. Verifying file failed!"
$SHOW_QUOTA_USER
- resetquota -u $TSTUSR
- rm -rf $TESTFILE
- sync; sleep 1; sync
+ rm -f $TESTFILE
+ sync
+
+ resetquota -u $TSTUSR
+ set_blk_unitsz $((128 * 1024))
+ set_blk_tunesz $((128 * 1024 / 2))
}
# test when mds does failover, the ost still could work well
run_test_with_stat 21 "run for fixing bug16053 ==========="
test_22() {
- local SAVEREFORMAT
-
- SAVEREFORMAT=$REFORMAT
- $LFS quotaoff -ug $DIR || error "could not turn quotas off"
-
quota_save_version "ug"
- REFORMAT="reformat"
stopall
mount
setupall
- REFORMAT=$SAVEREFORMAT
echo "checking parameters"
}
run_test_with_stat 22 "test if quota_type saved as permanent parameter ===="
-# It is triggered when test_23 failed, diagnostic for bug 18293
-test_23_dumppage()
-{
- NUM=$1
- DUMPPAGE=`find /proc/fs/${FSNAME}/llite/ -name dump_page_cache`
- qtime=`date +%s`
- cat $DUMPPAGE > $TMP/sanity-quota_test_23_${qtime}_${NUM}.log
- fsize=`stat -c%s $TMP/sanity-quota_test_23_${qtime}_${NUM}.log`
- if [ $fsize -eq 0 ]; then
- rm -f $TMP/sanity-quota_test_23_${qtime}_${NUM}.log
- else
- error "some IO error was found during directIO"
- fi
-}
-
test_23_sub() {
mkdir -p $DIR/$tdir
chmod 0777 $DIR/$tdir
log " Step1: trigger quota with 0_DIRECT"
log " Write half of file"
$RUNAS $DIRECTIO write $TESTFILE 0 $(($LIMIT/1024/2)) $bs_unit || \
- (quota_error u $TSTUSR "(1) write failure, but expect success: $LIMIT" && test_23_dumppage 1)
+ quota_error u $TSTUSR "(1) write failure, but expect success: $LIMIT"
log " Write out of block quota ..."
$RUNAS $DIRECTIO write $TESTFILE $(($LIMIT/1024/2)) $(($LIMIT/1024/2)) $bs_unit && \
- quota_error u $TSTUSR "(2) write success, but expect EDQUOT: $LIMIT" && test_23_dumppage 2
+ quota_error u $TSTUSR "(2) write success, but expect EDQUOT: $LIMIT"
log " Step1: done"
log " Step2: rewrite should succeed"
- $RUNAS $DIRECTIO write $TESTFILE $(($LIMIT/1024/2)) 1 $bs_unit || \
- (quota_error u $TSTUSR "(3) write failure, but expect success: $LIMIT" && test_23_dumppage 3)
+ $RUNAS $DIRECTIO write $TESTFILE 0 1 $bs_unit || \
+ quota_error u $TSTUSR "(3) write failure, but expect success: $LIMIT"
log " Step2: done"
rm -f $TESTFILE
}
run_test_with_stat 26 "test for false quota error(bz18491) ======================================"
+test_27() {
+ $LFS quota $TSTUSR $DIR && error "lfs succeeded with no type, but should have failed"
+ $LFS setquota $TSTUSR $DIR && error "lfs succeeded with no type, but should have failed"
+ return 0
+}
+run_test_with_stat 27 "lfs quota/setquota should handle wrong arguments (19612) ================="
+
# turn off quota
test_99()
{