7 export PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH:/sbin
8 . $SRCDIR/test-framework.sh
14 RUNAS=${RUNAS:-"runas -u $TSTID"}
16 BUNIT_SZ=1000 # 1000 quota blocks
17 BTUNE_SZ=500 # 500 quota blocks
18 IUNIT_SZ=10 # 10 files
23 MOUNT="`cat /proc/mounts | grep "lustre" | awk '{print $2}'`"
24 if [ -z "$MOUNT" ]; then
25 echo "ERROR: lustre not mounted, quit test!"
28 OSTCOUNT=`cat /proc/fs/lustre/lov/*/activeobd | head -n 1`
29 TSTDIR="$MOUNT/quota_dir"
31 # set_blk_tunables(btune_sz)
33 # set btune size on all obdfilters
34 for i in `ls /proc/fs/lustre/obdfilter/*/quota_btune_sz`; do
35 echo $(($1 * $BLK_SZ)) > $i
37 # set btune size on mds
38 for i in `ls /proc/fs/lustre/mds/mds*/quota_btune_sz`; do
39 echo $(($1 * $BLK_SZ)) > $i
43 # se_blk_unitsz(bunit_sz)
45 for i in `ls /proc/fs/lustre/obdfilter/*/quota_bunit_sz`; do
46 echo $(($1 * $BLK_SZ)) > $i
48 for i in `ls /proc/fs/lustre/mds/mds*/quota_bunit_sz`; do
49 echo $(($1 * $BLK_SZ)) > $i
53 # set_file_tunesz(itune_sz)
55 # set iunit and itune size on all obdfilters
56 for i in `ls /proc/fs/lustre/obdfilter/*/quota_itune_sz`; do
59 # set iunit and itune size on mds
60 for i in `ls /proc/fs/lustre/mds/mds*/quota_itune_sz`; do
66 # set_file_unitsz(iunit_sz)
68 for i in `ls /proc/fs/lustre/obdfilter/*/quota_iunit_sz`; do
71 for i in `ls /proc/fs/lustre/mds/mds*/quota_iunit_sz`; do
78 GRP="`cat /etc/group | grep "$USER" | awk -F: '{print $1}'`"
79 if [ -z "$GRP" ]; then
80 groupadd -g $TSTID "$USER"
82 TSTID="`cat /etc/group | grep "$USER" | awk -F: '{print $3}'`"
85 USR="`cat /etc/passwd | grep "$USER" | awk -F: '{print $1}'`"
86 if [ -z "$USR" ]; then
87 useradd -u $TSTID -g $TSTID -d /tmp "$USER"
90 RUNAS="runas -u $TSTID"
93 set_blk_tunesz $BTUNE_SZ
94 set_blk_unitsz $BUNIT_SZ
96 set_file_tunesz $ITUNE_SZ
97 set_file_unitsz $IUNIT_SZ
99 [ -d $TSTDIR ] || mkdir $TSTDIR
104 # restore block tunables to default size
105 set_blk_unitsz $((1024 * 100))
106 set_blk_tunesz $((1024 * 50))
107 # restore file tunables to default size
112 # delete test user and group
118 echo "== Enable quota"
119 $LFS quotaoff -ug $MOUNT
120 $LFS quotacheck -ug $MOUNT
122 $LFS setquota -u $USER 0 0 0 0 $MOUNT
123 $LFS setquota -g $USER 0 0 0 0 $MOUNT
127 # block hard limit (normal use and out of quota)
129 echo "== Block hard limit"
130 LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits each sever
131 TESTFILE="$TSTDIR/quota_tst20"
133 echo " User quota (limit: $LIMIT bytes)"
134 $LFS setquota -u $USER 0 $LIMIT 0 0 $MOUNT
136 $RUNAS touch $TESTFILE >/dev/null 2>&1
139 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) > /dev/null 2>&1 || error "(usr) write failure, but expect success"
141 echo " Write out of block quota ..."
142 # this time maybe cache write, ignore it's failure
143 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) seek=$(($LIMIT/2)) > /dev/null 2>&1 || echo " " > /dev/null
144 # flush cache, ensure noquota flag is setted on client
146 $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"
151 echo " Group quota (limit: $LIMIT bytes)"
152 $LFS setquota -u $USER 0 0 0 0 $MOUNT # clear user limit
153 $LFS setquota -g $USER 0 $LIMIT 0 0 $MOUNT
154 TESTFILE="$TSTDIR/quota_tst21"
156 $RUNAS touch $TESTFILE >/dev/null 2>&1
159 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) > /dev/null 2>&1 || error "(grp) write failure, but expect success"
161 echo " Write out of block quota ..."
162 # this time maybe cache write, ignore it's failure
163 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) seek=$(($LIMIT/2)) > /dev/null 2>&1 || echo " " > /dev/null
165 $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"
170 $LFS setquota -g $USER 0 0 0 0 $MOUNT
174 # file hard limit (normal use and out of quota)
176 echo "== File hard limit"
177 LIMIT=$(($IUNIT_SZ * 10)) # 10 iunits on mds
178 TESTFILE="$TSTDIR/quota_tst30"
180 echo " User quota (limit: $LIMIT files)"
181 $LFS setquota -u $USER 0 0 0 $LIMIT $MOUNT
183 echo " Create $LIMIT files ..."
184 for i in `seq ${LIMIT}`; do
185 $RUNAS touch ${TESTFILE}_$i > /dev/null 2>&1 || error "(usr) touch failure, but except success"
188 echo " Create out of file quota ..."
189 $RUNAS touch ${TESTFILE}_xxx > /dev/null 2>&1 && error "(usr) touch success, but expect EDQUOT"
192 for i in `seq ${LIMIT}`; do
196 echo " Group quota (limit: $LIMIT files)"
197 $LFS setquota -u $USER 0 0 0 0 $MOUNT # clear user limit
198 $LFS setquota -g $USER 0 0 0 $LIMIT $MOUNT
199 TESTFILE="$TSTDIR/quota_tst31"
201 echo " Create $LIMIT files ..."
202 for i in `seq ${LIMIT}`; do
203 $RUNAS touch ${TESTFILE}_$i > /dev/null 2>&1 || error "(grp) touch failure, but expect success"
206 echo " Create out of file quota ..."
207 $RUNAS touch ${TESTFILE}_xxx > /dev/null 2>&1 && error "(grp) touch success, but expect EDQUOT"
211 for i in `seq ${LIMIT}`; do
214 $LFS setquota -g $USER 0 0 0 0 $MOUNT
221 BS=$(($BUNIT_SZ * $BLK_SZ))
223 echo " Write to exceed soft limit"
224 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ >/dev/null 2>&1 || error "write failure, but expect success"
227 echo " Write before timer goes off"
228 $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"
232 echo " Sleep $GRACE seconds ..."
235 echo " Write after timer goes off"
236 # maybe cache write, ignore.
237 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$(($BUNIT_SZ * 2)) >/dev/null 2>&1 || echo " " > /dev/null
239 $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"
242 echo " Unlink file to stop timer"
247 $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ >/dev/null 2>&1 || error "write failure, but expect success"
254 # block soft limit (start timer, timer goes off, stop timer)
256 echo "== Block soft limit"
257 LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) )) # 1 bunits each sever
258 TESTFILE="$TSTDIR/quota_tst40"
261 echo " User quota (soft limit: $LIMIT bytes grace: $GRACE seconds)"
262 $LFS setquota -t -u $GRACE $MAX_IQ_TIME $MOUNT
263 $LFS setquota -u $USER $LIMIT 0 0 0 $MOUNT
265 test_block_soft $TESTFILE $GRACE
266 $LFS setquota -u $USER 0 0 0 0 $MOUNT
268 echo " Group quota (soft limit: $LIMIT bytes grace: $GRACE seconds)"
269 $LFS setquota -t -g $GRACE $MAX_IQ_TIME $MOUNT
270 $LFS setquota -g $USER $LIMIT 0 0 0 $MOUNT
271 TESTFILE="$TSTDIR/quota_tst41"
273 test_block_soft $TESTFILE $GRACE
274 $LFS setquota -g $USER 0 0 0 0 $MOUNT
284 echo " Create files to exceed soft limit"
285 for i in `seq $LIMIT`; do
286 $RUNAS touch ${TESTFILE}_$i >/dev/null 2>&1 || error "touch failure, but expect success"
290 echo " Create file before timer goes off"
291 $RUNAS touch ${TESTFILE}_before >/dev/null 2>&1 || error "touch before timer goes off failure, but expect success"
294 echo " Sleep $GRACE seconds ..."
297 echo " Create file after timer goes off"
298 for i in `seq $(($IUNIT_SZ - 1))`; do
299 $RUNAS touch ${TESTFILE}_after_$i >/dev/null 2>&1 || error "touch ${TESTFILE}_after_$i failure, but expect success"
301 $RUNAS touch ${TESTFILE}_after >/dev/null 2>&1 && error "touch after timer goes off success, but expect EDQUOT"
304 echo " Unlink files to stop timer"
305 for i in `seq $LIMIT`; do
306 rm -f ${TESTFILE}_$i >/dev/null 2>&1 || error "rm ${TESTFILE}_$i failure"
308 rm -f ${TESTFILE}_before
309 for i in `seq $(($IUNIT_SZ - 1))`; do
310 rm -f ${TESTFILE}_after_$i >/dev/null 2>&1 || error "rm ${TESTFILE}_after_$i failure"
315 $RUNAS touch ${TESTFILE}_xxx >/dev/null 2>&1 || error "touch after timer stop failure, but expect success"
319 rm -f ${TESTFILE}_xxx
322 # file soft limit (start timer, timer goes off, stop timer)
324 echo "== File soft limit"
325 LIMIT=$(($IUNIT_SZ * 10)) # 10 iunits on mds
326 TESTFILE="$TSTDIR/quota_tst50"
329 echo " User quota (soft limit: $LIMIT files grace: $GRACE seconds)"
330 $LFS setquota -t -u $MAX_DQ_TIME $GRACE $MOUNT
331 $LFS setquota -u $USER 0 0 $LIMIT 0 $MOUNT
333 test_file_soft $TESTFILE $LIMIT $GRACE
334 $LFS setquota -u $USER 0 0 0 0 $MOUNT
336 echo " Group quota (soft limit: $LIMIT files grace: $GRACE seconds)"
337 $LFS setquota -t -g $MAX_DQ_TIME $GRACE $MOUNT
338 $LFS setquota -g $USER 0 0 $LIMIT 0 $MOUNT
339 TESTFILE="$TSTDIR/quota_tst51"
341 test_file_soft $TESTFILE $LIMIT $GRACE
342 $LFS setquota -g $USER 0 0 0 0 $MOUNT
345 $LFS setquota -t -u $MAX_DQ_TIME $MAX_IQ_TIME $MOUNT
346 $LFS setquota -t -g $MAX_DQ_TIME $MAX_IQ_TIME $MOUNT
350 # chown & chgrp (chown & chgrp successfully even out of block/file quota)
352 echo "== Chown/Chgrp ignore quota"
353 BLIMIT=$(( $BUNIT_SZ * $((OSTCOUNT + 1)) * 10)) # 10 bunits on each server
354 ILIMIT=$(( $IUNIT_SZ * 10 )) # 10 iunits on mds
356 echo " Set quota limit (0 $BLIMIT 0 $ILIMIT) for $USER.$USER"
357 $LFS setquota -u $USER 0 $BLIMIT 0 $ILIMIT $MOUNT
358 $LFS setquota -g $USER 0 $BLIMIT 0 $ILIMIT $MOUNT
360 echo " Create more than $ILIMIT files and alloc more than $BLIMIT blocks ..."
361 for i in `seq $(($ILIMIT + 1))`; do
362 touch $TSTDIR/quota_tst60_$i > /dev/null 2>&1 || error "touch failure, expect success"
364 dd if=/dev/zero of=$TSTDIR/quota_tst60_1 bs=$BLK_SZ count=$(($BLIMIT+1)) > /dev/null 2>&1 || error "write failure, expect success"
366 echo " Chown files to $USER.$USER ..."
367 for i in `seq $(($ILIMIT + 1))`; do
368 chown $USER.$USER $TSTDIR/quota_tst60_$i > /dev/null 2>&1 || error "chown failure, but expect success"
372 for i in `seq $(($ILIMIT + 1))`; do
373 rm -f $TSTDIR/quota_tst60_$i
375 $LFS setquota -u $USER 0 0 0 0 $MOUNT
376 $LFS setquota -g $USER 0 0 0 0 $MOUNT
380 # block quota acquire & release
382 echo "== Block quota acqurie / release"
384 if [ $OSTCOUNT -lt 2 ]; then
385 echo "WARN: too few osts, skip this test."
389 LIMIT=$(($BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits per server
390 FILEA="$TSTDIR/quota_tst70_a"
391 FILEB="$TSTDIR/quota_tst70_b"
393 echo " Set block limit $LIMIT bytes to $USER.$USER"
394 $LFS setquota -u $USER 0 $LIMIT 0 0 $MOUNT
395 $LFS setquota -g $USER 0 $LIMIT 0 0 $MOUNT
397 echo " Create filea on OST0 and fileb on OST1"
398 $LFS setstripe $FILEA 65536 0 1
399 $LFS setstripe $FILEB 65536 1 1
400 chown $USER.$USER $FILEA
401 chown $USER.$USER $FILEB
403 echo " Exceed quota limit ..."
404 $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"
406 $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"
408 echo " Write to OST0 return EDQUOT"
409 # this write maybe cache write, ignore it's failure
410 $RUNAS dd if=/dev/zero of=$FILEA bs=$BLK_SZ count=$(($BUNIT_SZ * 2)) >/dev/null 2>&1 || echo " " > /dev/null
412 $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"
415 echo " Remove fileb to let OST1 release quota"
418 echo " Write to OST0"
419 $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"
424 $LFS setquota -u $USER 0 0 0 0 $MOUNT
425 $LFS setquota -g $USER 0 0 0 0 $MOUNT
432 echo "=== Turn off quota"