Whamcloud - gitweb
LU-333: Make read_bytes in llite/*/stats report bytes read.
[fs/lustre-release.git] / lustre / tests / sanity.sh
index a46297c..38fcd12 100644 (file)
@@ -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
@@ -3587,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 =========="
 
@@ -3897,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
 
@@ -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
@@ -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,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
 #