X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity-quota.sh;h=5b07fa33b4502bfcec07718a11b29edae7565cdc;hb=1a2b381616b372efb5e386ef5fff3aa2f76873a4;hp=f999962da653fba8360d9153f1544701eebfcf8a;hpb=dd8a4db4979464538184edf993daf7df0c89b4e7;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity-quota.sh b/lustre/tests/sanity-quota.sh index f999962..5b07fa3 100755 --- a/lustre/tests/sanity-quota.sh +++ b/lustre/tests/sanity-quota.sh @@ -355,34 +355,48 @@ wait_grace_time() { case $flavour in block) time=$(lfs quota -$qtype $qarg $parg $DIR| - awk 'NR == 3{ print $5 }'| sed 's/s$//') + awk 'NR == 3{ print $5 }') ;; file) time=$(lfs quota -$qtype $qarg $DIR| - awk 'NR == 3{ print $9 }'| sed 's/s$//') + awk 'NR == 3{ print $9 }') ;; *) error "Unknown quota type: $flavour" ;; esac + local sleep_seconds=0 + local orig_time=$time + + echo "Grace time is $time" # from lfs.c:__sec2str() # const char spec[] = "smhdw"; # {1, 60, 60*60, 24*60*60, 7*24*60*60}; - [[ $time == *m* ]] && time=${time//m/} && time=$((time*60)); - [[ $time == *h* ]] && time=${time//h/} && time=$((time*60*60)); - [[ $time == *d* ]] && time=${time//d/} && time=$((time*24*60*60)); - [[ $time == *w* ]] && time=${time//w/} && time=$((time*7*24*60*60)); + [[ $time == *w* ]] && w_time=${time%w*} && + let sleep_seconds+=$((w_time*7*24*60*60)); + time=${time#*w} + [[ $time == *d* ]] && d_time=${time%d*} && + let sleep_seconds+=$((d_time*24*60*60)); + time=${time#*d} + [[ $time == *h* ]] && h_time=${time%h*} && + let sleep_seconds+=$((h_time*60*60)); + time=${time#*h} + [[ $time == *m* ]] && m_time=${time%m*} && + let sleep_seconds+=$((m_time*60)); + time=${time#*m} + [[ $time == *s* ]] && s_time=${time%s*} && + let sleep_seconds+=$s_time echo "Sleep through grace ..." - [ "$time" == "-" ] && + [ "$orig_time" == "-" ] && error "Grace timeout was not set or quota not exceeded" - if [ "$time" == "none" ]; then + if [ "$orig_time" == "none" ]; then echo "...Grace timeout already expired" else - let time+=$extrasleep - echo "...sleep $time seconds" - sleep $time + let sleep_seconds+=$extrasleep + echo "...sleep $sleep_seconds seconds" + sleep $sleep_seconds fi } @@ -1088,9 +1102,7 @@ test_1h() { local limit=10 # 10M local testfile="$DIR/$tdir/$tfile-0" - [ "$ost1_FSTYPE" != ldiskfs ] && skip "non-ldiskfs backend" - [ $OST1_VERSION -lt $(version_code 2.13.50) ] && - skip "Need OST version at least 2.13.53" + check_set_fallocate_or_skip setup_quota_test || error "setup quota failed with $?" trap cleanup_quota_test EXIT @@ -1565,6 +1577,8 @@ test_file_soft() { local LIMIT=$2 local grace=$3 local qtype=$4 + local SOFT_LIMIT=$(do_facet $SINGLEMDS $LCTL get_param -n \ + qmt.$FSNAME-QMT0000.md-0x0.soft_least_qunit) setup_quota_test trap cleanup_quota_test EXIT @@ -1597,12 +1611,8 @@ test_file_soft() { $SHOW_QUOTA_INFO_PROJID echo "Create file after timer goes off" - # There is a window that space is accounted in the quota usage but - # hasn't been decreased from the pending write, if we acquire quota - # in this window, we'll acquire more than we needed. - $RUNAS touch ${TESTFILE}_after_1 ${TESTFILE}_after_2 || true - sync_all_data || true - $RUNAS touch ${TESTFILE}_after_3 && + # exceed least soft limit is possible + $RUNAS createmany -m ${TESTFILE}_after_3 $((SOFT_LIMIT + 1)) && quota_error a $TSTUSR "create after timer expired," \ "but expect EDQUOT" sync_all_data || true @@ -3561,6 +3571,50 @@ test_40d() { } run_test 40d "Stripe Directory inherit project quota properly" +test_41() { + is_project_quota_supported || + skip "Project quota is not supported" + setup_quota_test || error "setup quota failed with $?" + trap cleanup_quota_test EXIT + local dir="$DIR/$tdir/dir" + local blimit=102400 + local ilimit=4096 + local projid=$((testnum * 1000)) + + quota_init + + # enable mdt/ost quota + set_mdt_qtype ugp || error "enable mdt quota failed" + set_ost_qtype ugp || error "enable ost quota failed" + + test_mkdir -p $dir && change_project -sp $projid $dir + $LFS setquota -p $projid -b 0 -B ${blimit}K -i 0 -I $ilimit $dir || + error "set project quota failed" + + sync; sync_all_data + sleep_maxage + + # check if df output works as expected + echo "== global statfs: $MOUNT ==" + df -kP $MOUNT; df -iP $MOUNT; $LFS quota -p $projid $dir + echo + echo "== project statfs (prjid=$projid): $dir ==" + df -kP $dir; df -iP $dir + local bused=$(getquota -p $projid global curspace) + local iused=$(getquota -p $projid global curinodes) + # note trailing space to match double printf from awk + local expected="$blimit $bused $ilimit $iused " + + wait_update $HOSTNAME \ + "{ df -kP $dir; df -iP $dir; } | + awk '/$FSNAME/ { printf \\\"%d %d \\\", \\\$2,\\\$3 }'" \ + "$expected" || + error "failed to get correct statfs for project quota" + + cleanup_quota_test +} +run_test 41 "df should return projid-specific values" + test_50() { ! is_project_quota_supported && skip "Project quota is not supported" @@ -3940,6 +3994,10 @@ test_default_quota() { fi log "Increase default quota" + + # LU-4505: sleep 5 seconds to enable quota acquire + sleep 5 + # increase default quota $LFS setquota $qdtype $qs $((LIMIT*3)) $qh $((LIMIT*3)) $DIR || error "set default quota failed" @@ -3975,6 +4033,10 @@ test_default_quota() { fi log "Set to use default quota again" + + # LU-4505: sleep 5 seconds to enable quota acquire + sleep 5 + $LFS setquota $qtype $qid -d $DIR || error "set $qid to use default quota failed"