X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=aa53e3c122e27b5bad08da0b1da81f5dd802d78d;hb=0517160dd68ac026513ad1b8e3e6f7abd4acfdef;hp=a46297c019390bac35fb541ae39781423de70332;hpb=58f3eb928f563f24f0b3ee41970fa23a59fdcb87;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index a46297c..aa53e3c 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 @@ -1209,9 +1207,9 @@ test_27u() { # bug 4900 run_test 27u "skip object creation on OSC w/o objects ==========" test_27v() { # bug 4900 - [ "$OSTCOUNT" -lt "2" ] && skip_env "too few OSTs" && return - remote_mds_nodsh && skip "remote MDS with nodsh" && return - remote_ost_nodsh && skip "remote OST with nodsh" && return + [ "$OSTCOUNT" -lt "2" ] && skip_env "too few OSTs" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return exhaust_all_precreations 0x215 reset_enospc @@ -1230,9 +1228,10 @@ test_27v() { # bug 4900 local FINISH=`date +%s` local TIMEOUT=`lctl get_param -n timeout` - [ $((FINISH - START)) -ge $((TIMEOUT / 2)) ] && \ + local PROCESS=$((FINISH - START)) + [ $PROCESS -ge $((TIMEOUT / 2)) ] && \ error "$FINISH - $START >= $TIMEOUT / 2" - + sleep $((TIMEOUT / 2 - PROCESS)) reset_enospc } run_test 27v "skip object creation on slow OST =================" @@ -1887,7 +1886,7 @@ test_33c() { for ostnum in $(seq $OSTCOUNT); do # test-framework's OST numbering is one-based, while Lustre's # is zero-based - ostname=$(printf "lustre-OST%.4d" $((ostnum - 1))) + ostname=$(printf "$FSNAME-OST%.4d" $((ostnum - 1))) # Parsing llobdstat's output sucks; we could grep the /proc # path, but that's likely to not be as portable as using the # llobdstat utility. So we parse lctl output instead. @@ -1911,7 +1910,7 @@ test_33c() { # Total up write_bytes after writing. We'd better find non-zeros. for ostnum in $(seq $OSTCOUNT); do - ostname=$(printf "lustre-OST%.4d" $((ostnum - 1))) + ostname=$(printf "$FSNAME-OST%.4d" $((ostnum - 1))) write_bytes=$(do_facet ost$ostnum lctl get_param -n \ obdfilter/$ostname/stats | awk '/^write_bytes/ {print $7}' ) @@ -1926,7 +1925,7 @@ test_33c() { if $all_zeros then for ostnum in $(seq $OSTCOUNT); do - ostname=$(printf "lustre-OST%.4d" $((ostnum - 1))) + ostname=$(printf "$FSNAME-OST%.4d" $((ostnum - 1))) echo "Check that write_bytes is present in obdfilter/*/stats:" do_facet ost$ostnum lctl get_param -n \ obdfilter/$ostname/stats @@ -3587,7 +3586,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 ==========" @@ -3897,6 +3896,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 @@ -4170,13 +4171,12 @@ set_checksums() return 0 } -export ORIG_CSUM_TYPE="" +export ORIG_CSUM_TYPE="`lctl get_param -n osc/*osc-[^mM]*/checksum_type | + sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`" CKSUM_TYPES=${CKSUM_TYPES:-"crc32 adler"} +[ "$ORIG_CSUM_TYPE" = "crc32c" ] && CKSUM_TYPES="$CKSUM_TYPES crc32c" set_checksum_type() { - [ "$ORIG_CSUM_TYPE" ] || \ - ORIG_CSUM_TYPE=`lctl get_param -n osc/*osc-[^mM]*/checksum_type | - sed 's/.*\[\(.*\)\].*/\1/g' | head -n1` lctl set_param -n osc.*osc-[^mM]*.checksum_type $1 log "set checksum type to $1" return 0 @@ -4422,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 @@ -5057,7 +5089,7 @@ test_104a() { OSC=`lctl get_param -n devices | awk '/-osc-/ {print $4}' | head -n 1` lctl --device %$OSC deactivate lfs df || error "lfs df with deactivated OSC failed" - lctl --device %$OSC recover + lctl --device %$OSC activate lfs df || error "lfs df with reactivated OSC failed" rm -f $DIR/$tfile } @@ -6226,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)) @@ -6262,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 @@ -6693,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" @@ -8045,6 +8216,69 @@ 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" + +test_220() { #LU-325 + local OSTIDX=0 + + mkdir -p $DIR/$tdir + local OST=$(lfs osts | grep ${OSTIDX}": " | \ + awk '{print $2}' | sed -e 's/_UUID$//') + + # on the mdt's osc + local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST) + local last_id=$(do_facet $SINGLEMDS lctl get_param -n \ + osc.$mdtosc_proc1.prealloc_last_id) + local next_id=$(do_facet $SINGLEMDS lctl get_param -n \ + osc.$mdtosc_proc1.prealloc_next_id) + + $LFS df -i + + do_facet mgs $LCTL pool_new $FSNAME.$TESTNAME || return 1 + do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2 + + $SETSTRIPE $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME + + echo "preallocated objects in MDS is $((last_id - next_id))" \ + "($last_id - $next_id)" + + count=$($LFS df -i $MOUNT | grep ^$OST | awk '{print $4}') + echo "OST still has $count objects" + + free=$((count + last_id - next_id)) + echo "create $((free - next_id)) files @next_id..." + createmany -o $DIR/$tdir/f $next_id $free || return 3 + + local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \ + osc.$mdtosc_proc1.prealloc_last_id) + local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \ + osc.$mdtosc_proc1.prealloc_next_id) + + echo "after creation, last_id=$last_id2, next_id=$next_id2" + $LFS df -i + + echo "cleanup..." + + do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST || return 4 + do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME || return 5 + echo "unlink $((free - next_id)) files @ $next_id..." + unlinkmany $DIR/$tdir/f $next_id $free || return 3 +} +run_test 220 "the preallocated objects in MDS still can be used if ENOSPC is returned by OST with enough disk space" + # # tests that do cleanup/setup should be run at the end #