X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=38fcd1233195276704e8e3bfe8e84f6f4d0b811d;hb=37eeb0ffd0325c5a3c426d6ab0e72ef6da84db99;hp=5225cd0a03dde7dbd2524899eea9a1e987f20b2d;hpb=dc0317c7150f068cff7343051092236b5c9c29eb;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 5225cd0..38fcd12 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -9,10 +9,8 @@ set -e ONLY=${ONLY:-"$*"} -# bug number for skipped test: 13297 2108 9789 3637 9789 3561 12622 12653 12653 5188 16260 19742 -ALWAYS_EXCEPT=" 27u 42a 42b 42c 42d 45 51d 65a 65e 68b $SANITY_EXCEPT" -# bug number for skipped test: 2108 9789 3637 9789 3561 5188/5749 1443 -#ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"27m 42a 42b 42c 42d 45 68 76"} +# bug number for skipped test: 13297 2108 9789 3637 9789 3561 12622 5188 +ALWAYS_EXCEPT=" 27u 42a 42b 42c 42d 45 51d 68b $SANITY_EXCEPT" # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT! # Tests that fail on uml @@ -784,6 +782,10 @@ test_24u() { # bug12192 } run_test 24u "create stripe file" +page_size() { + getconf PAGE_SIZE +} + test_24v() { local NRFILES=100000 local FREE_INODES=`lfs df -i|grep "filesystem summary" | awk '{print $5}'` @@ -793,8 +795,26 @@ test_24v() { mkdir -p $DIR/d24v createmany -m $DIR/d24v/$tfile $NRFILES + + cancel_lru_locks mdc + lctl set_param mdc.*.stats clear + ls $DIR/d24v >/dev/null || error "error in listing large dir" + # LU-5 large readdir + # DIRENT_SIZE = 32 bytes for sizeof(struct lu_dirent) + + # 8 bytes for name(filename is mostly 5 in this test) + + # 8 bytes for luda_type + # take into account of overhead in lu_dirpage header and end mark in + # each page, plus one in RPC_NUM calculation. + DIRENT_SIZE=48 + RPC_SIZE=$(($(lctl get_param -n mdc.*.max_pages_per_rpc)*$(page_size))) + RPC_NUM=$(((NRFILES * DIRENT_SIZE + RPC_SIZE - 1) / RPC_SIZE + 1)) + mds_readpage=`lctl get_param mdc.*.stats | \ + awk '/^mds_readpage/ {print $2}'` + [ $mds_readpage -gt $RPC_NUM ] && \ + error "large readdir doesn't take effect" + rm $DIR/d24v -rf } run_test 24v "list directory with large files (handle hash collision, bug: 17560)" @@ -1329,6 +1349,7 @@ check_seq_oid() local group=${lmm[$((j+3))]} local dev=$(ostdevname $devnum) local dir=${MOUNT%/*}/ost$devnum + local mntpt=$(facet_mntpt ost$devnum) stop ost$devnum do_facet ost$devnum mount -t $FSTYPE $dev $dir $OST_MOUNT_OPTS || @@ -1348,7 +1369,7 @@ check_seq_oid() [ $stripe -eq $i ] || { error "stripe mismatch"; return 6; } echo -e "\t\tost $obdidx, objid $objid, group $group" - do_facet ost$devnum umount -d $dev + do_facet ost$devnum umount -d $mntpt start ost$devnum $dev $OST_MOUNT_OPTS done } @@ -2613,10 +2634,6 @@ test_42d() { } run_test 42d "test complete truncate of file with cached dirty data" -page_size() { - getconf PAGE_SIZE -} - test_42e() { # bug22074 local TDIR=$DIR/${tdir}e local pagesz=$(page_size) @@ -3568,7 +3585,7 @@ TEST60_HEAD="test_60 run $RANDOM" test_60a() { [ ! -f run-llog.sh ] && skip_env "missing subtest run-llog.sh" && return log "$TEST60_HEAD - from kernel mode" - sh run-llog.sh + do_facet mgs sh run-llog.sh } run_test 60a "llog sanity tests run from kernel module ==========" @@ -3878,6 +3895,8 @@ swap_used() { # test case for lloop driver, basic function test_68a() { [ "$UID" != 0 ] && skip_env "must run as root" && return + llite_lloop_enabled || \ + { skip_env "llite_lloop module disabled" && return; } trap cleanup_68 EXIT @@ -4403,10 +4422,42 @@ test_80() { # bug 10718 error "elapsed for 1M@1T = $DIFF" fi true - rm -f $DIR/$tfile + rm -f $DIR/$tfile } run_test 80 "Page eviction is equally fast at high offsets too ====" +test_81a() { # LU-456 + # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228 + # MUST OR with the OBD_FAIL_ONCE (0x80000000) + do_facet ost0 lctl set_param fail_loc=0x80000228 + + # write should trigger a retry and success + $SETSTRIPE -i 0 -c 1 $DIR/$tfile + multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c + RC=$? + if [ $RC -ne 0 ] ; then + error "write should success, but failed for $RC" + fi +} +run_test 81a "OST should retry write when get -ENOSPC ===============" + +test_81b() { # LU-456 + # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228 + # Don't OR with the OBD_FAIL_ONCE (0x80000000) + do_facet ost0 lctl set_param fail_loc=0x228 + + # write should retry several times and return -ENOSPC finally + $SETSTRIPE -i 0 -c 1 $DIR/$tfile + multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c + RC=$? + ENOSPC=28 + if [ $RC -ne $ENOSPC ] ; then + error "dd should fail for -ENOSPC, but succeed." + fi +} +run_test 81b "OST should return -ENOSPC when retry still fails =======" + + test_99a() { [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs" && \ return @@ -6040,6 +6091,7 @@ test_124a() { LRU_SIZE=$(lctl get_param -n $PARAM) if [ $LRU_SIZE -gt $(default_lru_size) ]; then NSDIR=$(echo $PARAM | cut -d "." -f1-3) + log "NSDIR=$NSDIR" log "NS=$(basename $NSDIR)" break fi @@ -6057,6 +6109,7 @@ test_124a() { # for 10h. After that locks begin to be killed by client. local MAX_HRS=10 local LIMIT=`lctl get_param -n $NSDIR.pool.limit` + log "LIMIT=$LIMIT" # Make LVF so higher that sleeping for $SLEEP is enough to _start_ # killing locks. Some time was spent for creating locks. This means @@ -6071,6 +6124,7 @@ test_124a() { local LRU_SIZE_B=$LRU_SIZE log "LVF=$LVF" local OLD_LVF=`lctl get_param -n $NSDIR.pool.lock_volume_factor` + log "OLD_LVF=$OLD_LVF" lctl set_param -n $NSDIR.pool.lock_volume_factor $LVF # Let's make sure that we really have some margin. Client checks @@ -6204,7 +6258,7 @@ test_126() { # bug 12829/13455 } run_test 126 "check that the fsgid provided by the client is taken into account" -test_127() { # bug 15521 +test_127a() { # bug 15521 $SETSTRIPE -i 0 -c 1 $DIR/$tfile || error "setstripe failed" $LCTL set_param osc.*.stats=0 FSIZE=$((2048 * 1024)) @@ -6240,7 +6294,47 @@ test_127() { # bug 15521 [ "$read_bytes" != 0 ] || error "no read done" [ "$write_bytes" != 0 ] || error "no write done" } -run_test 127 "verify the client stats are sane" +run_test 127a "verify the client stats are sane" + +test_127b() { # bug LU-333 + $LCTL set_param llite.*.stats=0 + FSIZE=65536 # sized fixed to match PAGE_SIZE for most clients + # perform 2 reads and writes so MAX is different from SUM. + dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1 + dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1 + cancel_lru_locks osc + dd if=$DIR/$tfile of=/dev/null bs=$FSIZE count=1 + dd if=$DIR/$tfile of=/dev/null bs=$FSIZE count=1 + + $LCTL get_param llite.*.stats | grep samples > $TMP/${tfile}.tmp + while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do + echo "got $COUNT $NAME" + eval $NAME=$COUNT || error "Wrong proc format" + + case $NAME in + read_bytes) + [ $COUNT -ne 2 ] && error "count is not 2: $COUNT" + [ $MIN -ne $FSIZE ] && error "min is not $FSIZE: $MIN" + [ $MAX -ne $FSIZE ] && error "max is incorrect: $MAX" + [ $SUM -ne $((FSIZE * 2)) ] && error "sum is wrong: $SUM" + ;; + write_bytes) + [ $COUNT -ne 2 ] && error "count is not 2: $COUNT" + [ $MIN -ne $FSIZE ] && error "min is not $FSIZE: $MIN" + [ $MAX -ne $FSIZE ] && error "max is incorrect: $MAX" + [ $SUM -ne $((FSIZE * 2)) ] && error "sum is wrong: $SUM" + ;; + *) ;; + esac + done < $TMP/${tfile}.tmp + + #check that we actually got some stats + [ "$read_bytes" ] || error "Missing read_bytes stats" + [ "$write_bytes" ] || error "Missing write_bytes stats" + [ "$read_bytes" != 0 ] || error "no read done" + [ "$write_bytes" != 0 ] || error "no write done" +} +run_test 127b "verify the llite client stats are sane" test_128() { # bug 15212 touch $DIR/$tfile @@ -6671,6 +6765,105 @@ test_132() { #1028, SOM } run_test 132 "som avoids glimpse rpc" +check_stats() { + local res + local count + case $1 in + $SINGLEMDS) res=`do_facet $SINGLEMDS $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$2"` + ;; + ost) res=`do_facet ost $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$2"` + ;; + *) error "Wrong argument $1" ;; + esac + echo $res + count=`echo $res | awk '{print $2}'` + [ -z "$res" ] && error "The counter for $2 on $1 was not incremented" + # if the argument $3 is zero, it means any stat increment is ok. + if [ $3 -gt 0 ] ; then + [ $count -ne $3 ] && error "The $2 counter on $1 is wrong - expected $3" + fi +} + +test_133a() { + local testdir=$DIR/${tdir}/stats_testdir + mkdir -p $DIR/${tdir} + + # clear stats. + do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear + do_facet ost $LCTL set_param obdfilter.*.stats=clear + + # verify mdt stats first. + mkdir ${testdir} || error "mkdir failed" + check_stats $SINGLEMDS "mkdir" 1 + touch ${testdir}/${tfile} || "touch failed" + check_stats $SINGLEMDS "open" 1 + check_stats $SINGLEMDS "close" 1 + mknod ${testdir}/${tfile}-pipe p || "mknod failed" + check_stats $SINGLEMDS "mknod" 1 + rm -f ${testdir}/${tfile}-pipe || "pipe remove failed" + check_stats $SINGLEMDS "unlink" 1 + rm -f ${testdir}/${tfile} || error "file remove failed" + check_stats $SINGLEMDS "unlink" 2 + + # remove working dir and check mdt stats again. + rmdir ${testdir} || error "rmdir failed" + check_stats $SINGLEMDS "rmdir" 1 + + rm -rf $DIR/${tdir} +} +run_test 133a "Verifying MDT stats ========================================" + +test_133b() { + local testdir=$DIR/${tdir}/stats_testdir + mkdir -p ${testdir} || error "mkdir failed" + touch ${testdir}/${tfile} || "touch failed" + cancel_lru_locks mdc + + # clear stats. + do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear + do_facet ost $LCTL set_param obdfilter.*.stats=clear + + # extra mdt stats verification. + chmod 444 ${testdir}/${tfile} || error "chmod failed" + check_stats $SINGLEMDS "setattr" 1 + $LFS df || error "lfs failed" + check_stats $SINGLEMDS "statfs" 1 + + rm -rf $DIR/${tdir} +} +run_test 133b "Verifying extra MDT stats ==================================" + +test_133c() { + local testdir=$DIR/${tdir}/stats_testdir + mkdir -p ${testdir} || error "mkdir failed" + + # verify obdfilter stats. + $LFS setstripe -c 1 -o 0 ${testdir}/${tfile} + sync + cancel_lru_locks osc + + # clear stats. + do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear + do_facet ost $LCTL set_param obdfilter.*.stats=clear + + dd if=/dev/zero of=${testdir}/${tfile} conv=notrunc bs=1024k count=1 || error "dd failed" + sync + cancel_lru_locks osc + check_stats ost "write" 1 + + dd if=${testdir}/${tfile} of=/dev/null bs=1k count=1 || error "dd failed" + check_stats ost "read" 1 + + > ${testdir}/${tfile} || error "truncate failed" + check_stats ost "punch" 1 + + rm -f ${testdir}/${tfile} || error "file remove failed" + check_stats ost "destroy" 1 + + rm -rf $DIR/${tdir} +} +run_test 133c "Verifying OST stats ========================================" + test_140() { #bug-17379 mkdir -p $DIR/$tdir || error "Creating dir $DIR/$tdir" cd $DIR/$tdir || error "Changing to $DIR/$tdir" @@ -6843,23 +7036,9 @@ test_154() { } run_test 154 "Opening a file by FID" -test_155_load() { +test_155_small_load() { local temp=$TMP/$tfile local file=$DIR/$tfile - local list=$(comma_list $(osts_nodes)) - local big=$(do_nodes $list grep "cache" /proc/cpuinfo | \ - awk '{sum+=$4} END{print sum}') - local min_avail=$(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail | \ - sort -n | head -1) - local large_file_size=$((big * 2)) - - log "cache size on OSS is $big KB" - log "large file size is $large_file_size KB" - log "min available OST size is $min_avail KB" - - [ $min_avail -le $large_file_size ] && \ - skip "the minimum available OST size needs > $large_file_size KB" && \ - return 0 dd if=/dev/urandom of=$temp bs=6096 count=1 || \ error "dd of=$temp bs=6096 count=1 failed" @@ -6879,6 +7058,28 @@ test_155_load() { echo "12345" >>$file cmp $temp $file || error "$temp $file differ (append2)" + rm -f $temp $file + true +} + +test_155_big_load() { + local temp=$TMP/$tfile + local file=$DIR/$tfile + + free_min_max + local cache_size=$(do_facet ost$((MAXI+1)) \ + "awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo") + local large_file_size=$((cache_size * 2)) + + echo "OSS cache size: $cache_size KB" + echo "Large file size: $large_file_size KB" + + [ $MAXV -le $large_file_size ] && \ + skip_env "max available OST size needs > $large_file_size KB" && \ + return 0 + + $SETSTRIPE $file -c 1 -i $MAXI || error "$SETSTRIPE $file failed" + dd if=/dev/urandom of=$temp bs=$large_file_size count=1k || \ error "dd of=$temp bs=$large_file_size count=1k failed" cp $temp $file @@ -6893,30 +7094,58 @@ test_155_load() { test_155a() { set_cache read on set_cache writethrough on - test_155_load + test_155_small_load } -run_test 155a "Verification of correctness: read cache:on write_cache:on" +run_test 155a "Verify small file correctness: read cache:on write_cache:on" test_155b() { set_cache read on set_cache writethrough off - test_155_load + test_155_small_load } -run_test 155b "Verification of correctness: read cache:on write_cache:off" +run_test 155b "Verify small file correctness: read cache:on write_cache:off" test_155c() { set_cache read off set_cache writethrough on - test_155_load + test_155_small_load } -run_test 155c "Verification of correctness: read cache:off write_cache:on" +run_test 155c "Verify small file correctness: read cache:off write_cache:on" test_155d() { set_cache read off set_cache writethrough off - test_155_load + test_155_small_load } -run_test 155d "Verification of correctness: read cache:off write_cache:off " +run_test 155d "Verify small file correctness: read cache:off write_cache:off" + +test_155e() { + set_cache read on + set_cache writethrough on + test_155_big_load +} +run_test 155e "Verify big file correctness: read cache:on write_cache:on" + +test_155f() { + set_cache read on + set_cache writethrough off + test_155_big_load +} +run_test 155f "Verify big file correctness: read cache:on write_cache:off" + +test_155g() { + set_cache read off + set_cache writethrough on + test_155_big_load +} +run_test 155g "Verify big file correctness: read cache:off write_cache:on" + +test_155h() { + set_cache read off + set_cache writethrough off + test_155_big_load +} +run_test 155h "Verify big file correctness: read cache:off write_cache:off" test_156() { local CPAGES=3 @@ -7310,7 +7539,9 @@ test_170() { local expected_good=$((good_line1 + good_line2*2)) rm -f $TMP/${tfile}* - if [ $bad_line -ne $bad_line_new ]; then + # LU-231, short malformed line may not be counted into bad lines + if [ $bad_line -ne $bad_line_new ] && + [ $bad_line -ne $((bad_line_new - 1)) ]; then error "expected $bad_line bad lines, but got $bad_line_new" return 1 fi @@ -7347,6 +7578,9 @@ setup_obdecho_osc () { local ost_nid=$1 local obdfilter_name=$2 echo "Creating new osc for $obdfilter_name on $ost_nid" + # make sure we can find loopback nid + $LCTL add_uuid $ost_nid $ost_nid >/dev/null 2>&1 + [ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \ ${obdfilter_name}_osc_UUID || rc=2; } [ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \ @@ -7420,6 +7654,25 @@ test_180b() { } run_test 180b "test obdecho directly on obdfilter" +test_181() { # bug 22177 + mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir" + # create enough files to index the directory + createmany -o $DIR/$tdir/foobar 4000 + # print attributes for debug purpose + lsattr -d . + # open dir + multiop_bg_pause $DIR/$tdir D_Sc || return 1 + MULTIPID=$! + # remove the files & current working dir + unlinkmany $DIR/$tdir/foobar 4000 + rmdir $DIR/$tdir + kill -USR1 $MULTIPID + wait $MULTIPID + stat $DIR/$tdir && error "open-unlinked dir was not removed!" + return 0 +} +run_test 181 "Test open-unlinked dir ========================" + # OST pools tests POOL=${POOL:-cea1} TGT_COUNT=$OSTCOUNT @@ -7605,6 +7858,136 @@ run_test 201c "Remove a pool ============================================" cleanup_pools $FSNAME +# usage: default_attr +default_attr() { + $LCTL get_param -n lov.$FSNAME-clilov-\*.stripe${1} +} + +# usage: trim +# Trims leading and trailing whitespace from the parameter string +trim() { + echo $@ +} + +# usage: check_default_stripe_attr +check_default_stripe_attr() { + # $GETSTRIPE returns trailing whitespace which needs to be trimmed off + ACTUAL=$(trim $($GETSTRIPE --$1 $DIR/$tdir)) + if [ $1 = "count" -o $1 = "size" ]; then + EXPECTED=`default_attr $1`; + else + # the 'stripeoffset' parameter prints as an unsigned int, so + # until this is fixed we hard-code -1 here + EXPECTED=-1; + fi + [ "x$ACTUAL" != "x$EXPECTED" ] && + error "$DIR/$tdir has stripe $1 '$ACTUAL', not '$EXPECTED'" +} + +# usage: check_raw_stripe_attr +check_raw_stripe_attr() { + # $GETSTRIPE returns trailing whitespace which needs to be trimmed off + ACTUAL=$(trim $($GETSTRIPE --raw --$1 $DIR/$tdir)) + if [ $1 = "count" -o $1 = "size" ]; then + EXPECTED=0; + else + EXPECTED=-1; + fi + [ "x$ACTUAL" != "x$EXPECTED" ] && + error "$DIR/$tdir has raw stripe $1 '$ACTUAL', not '$EXPECTED'" +} + + +test_204a() { + mkdir -p $DIR/$tdir + $SETSTRIPE --count 0 --size 0 --offset -1 $DIR/$tdir + + check_default_stripe_attr count + check_default_stripe_attr size + check_default_stripe_attr offset + + return 0 +} +run_test 204a "Print default stripe attributes =================" + +test_204b() { + mkdir -p $DIR/$tdir + $SETSTRIPE --count 1 $DIR/$tdir + + check_default_stripe_attr size + check_default_stripe_attr offset + + return 0 +} +run_test 204b "Print default stripe size and offset ===========" + +test_204c() { + mkdir -p $DIR/$tdir + $SETSTRIPE --size 65536 $DIR/$tdir + + check_default_stripe_attr count + check_default_stripe_attr offset + + return 0 +} +run_test 204c "Print default stripe count and offset ===========" + +test_204d() { + mkdir -p $DIR/$tdir + $SETSTRIPE --offset 0 $DIR/$tdir + + check_default_stripe_attr count + check_default_stripe_attr size + + return 0 +} +run_test 204d "Print default stripe count and size =============" + +test_204e() { + mkdir -p $DIR/$tdir + $SETSTRIPE -d $DIR/$tdir + + check_raw_stripe_attr count + check_raw_stripe_attr size + check_raw_stripe_attr offset + + return 0 +} +run_test 204e "Print raw stripe attributes =================" + +test_204f() { + mkdir -p $DIR/$tdir + $SETSTRIPE --count 1 $DIR/$tdir + + check_raw_stripe_attr size + check_raw_stripe_attr offset + + return 0 +} +run_test 204f "Print raw stripe size and offset ===========" + +test_204g() { + mkdir -p $DIR/$tdir + $SETSTRIPE --size 65536 $DIR/$tdir + + check_raw_stripe_attr count + check_raw_stripe_attr offset + + return 0 +} +run_test 204g "Print raw stripe count and offset ===========" + +test_204h() { + mkdir -p $DIR/$tdir + $SETSTRIPE --offset 0 $DIR/$tdir + + check_raw_stripe_attr count + check_raw_stripe_attr size + + return 0 +} +run_test 204h "Print raw stripe count and size =============" + test_212() { size=`date +%s` size=$((size % 8192 + 1)) @@ -7833,6 +8216,21 @@ test_218() { } run_test 218 "parallel read and truncate should not deadlock =======================" +test_219() { + # write one partial page + dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 + # set no grant so vvp_io_commit_write will do sync write + $LCTL set_param fail_loc=0x411 + # write a full page at the end of file + dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc + + $LCTL set_param fail_loc=0 + dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3 + $LCTL set_param fail_loc=0x411 + dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc +} +run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND" + # # tests that do cleanup/setup should be run at the end #