Whamcloud - gitweb
LU-2547 test: re-enable 24a/b of recovery-small
[fs/lustre-release.git] / lustre / tests / recovery-small.sh
index 14a6e3e..165112a 100755 (executable)
@@ -16,12 +16,8 @@ init_logging
 require_dsh_mds || exit 0
 
 # also long tests: 19, 21a, 21e, 21f, 23, 27
-#                                   1  2.5  2.5    4    4          (min)"
-[ "$SLOW" = "no" ] && EXCEPT_SLOW="17  26a  26b    50   51     57"
 
-[ $(facet_fstype $SINGLEMDS) = "zfs" ] &&
-# bug number for skipped test:       LU-2547
-       ALWAYS_EXCEPT="$ALWAYS_EXCEPT 24a 24b"
+[ "$SLOW" = "no" ] && EXCEPT_SLOW=""
 
 build_test_filter
 
@@ -255,11 +251,12 @@ test_10d() {
        rm -f $TMP/$tfile
        echo -n ", world" | dd of=$TMP/$tfile bs=1c seek=5
 
+       remount_client $MOUNT
        mount_client $MOUNT2
 
        cancel_lru_locks osc
        $LFS setstripe -i 0 -c 1 $DIR1/$tfile
-       echo -n hello > $DIR1/$tfile
+       echo -n hello | dd of=$DIR1/$tfile bs=5
 
        stat $DIR2/$tfile >& /dev/null
        $LCTL set_param fail_err=71
@@ -267,8 +264,9 @@ test_10d() {
 
        client_reconnect
 
-       cmp $DIR1/$tfile $DIR2/$tfile || error "file contents differ"
-       cmp $DIR1/$tfile $TMP/$tfile || error "wrong content found"
+       cancel_lru_locks osc
+       cmp -l $DIR1/$tfile $DIR2/$tfile || error "file contents differ"
+       cmp -l $DIR1/$tfile $TMP/$tfile || error "wrong content found"
 
        evict=$(do_facet client $LCTL get_param osc.$FSNAME-OST0000*.state | \
                tr -d '\-\[\] ' | \
@@ -519,10 +517,10 @@ test_18c() {
     do_facet ost1 lctl set_param fail_loc=0x80000225
     # force reconnect
     sleep 1
-    df $MOUNT > /dev/null 2>&1
+    $LFS df $MOUNT > /dev/null 2>&1
     sleep 2
     # my understanding is that there should be nothing in the page
-    # cache after the client reconnects?     
+    # cache after the client reconnects?
     rc=0
     pgcache_empty || rc=2
     rm -f $f $TMP/$tfile
@@ -1495,6 +1493,11 @@ check_target_ir_state()
         local recovery_proc=obdfilter.${!name}.recovery_status
         local st
 
+       while : ; do
+               st=$(do_facet $target "$LCTL get_param -n $recovery_proc |
+                       awk '/status:/{ print \\\$2}'")
+               [ x$st = xRECOVERING ] || break
+       done
         st=$(do_facet $target "lctl get_param -n $recovery_proc |
                                awk '/IR:/{ print \\\$2}'")
        [ $st != ON -o $st != OFF -o $st != ENABLED -o $st != DISABLED ] ||
@@ -2142,6 +2145,7 @@ test_115_write() {
        local fail1=$1
        local fail2=$2
        local error=$3
+       local fail_val2=${4:-0}
 
        df $DIR
        touch $DIR/$tfile
@@ -2153,7 +2157,7 @@ test_115_write() {
        sleep 1
 
        df $MOUNT
-       set_nodes_failloc "$(osts_nodes)" $fail2
+       set_nodes_failloc "$(osts_nodes)" $fail2 $fail_val2
 
        wait $pid
        rc=$?
@@ -2178,7 +2182,10 @@ test_115b() {
 
        #define OBD_FAIL_PTLRPC_LONG_REQ_UNLINK  0x51b
        #define OBD_FAIL_OST_ENOSPC              0x215
-       test_115_write 0x8000051b 0x80000215 1
+
+       # pass $OSTCOUNT for the fail_loc to be caught
+       # appropriately by the IO thread
+       test_115_write 0x8000051b 0x80000215 1 $OSTCOUNT
 }
 run_test 115b "write: late REQ MDunlink and no bulk"
 
@@ -2457,6 +2464,89 @@ test_130c() {
 }
 run_test 130c "layout intent resend on a stale inode"
 
+test_132() {
+       local before=$(date +%s)
+       local evict
+
+       mount_client $MOUNT2 || error "mount filed"
+
+       rm -f $DIR/$tfile
+       # get a lock on client so that export would reach the stale list
+       $SETSTRIPE -i 0 $DIR/$tfile || error "setstripe failed"
+       dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 conv=fsync ||
+               error "dd failed"
+
+       #define OBD_FAIL_OST_PAUSE_PUNCH         0x236
+       do_facet ost1 $LCTL set_param fail_val=120 fail_loc=0x80000236
+
+       $TRUNCATE $DIR/$tfile 100 &
+
+       sleep 1
+       dd if=/dev/zero of=$DIR2/$tfile bs=4096 count=1 conv=notrunc ||
+               error "dd failed"
+
+       wait
+       umount_client $MOUNT2
+
+       evict=$(do_facet client $LCTL get_param \
+               osc.$FSNAME-OST0000-osc-*/state |
+           awk -F"[ [,]" '/EVICTED ]$/ { if (t<$5) {t=$5;} } END { print t }')
+
+       [ -z "$evict" ] || [[ $evict -le $before ]] ||
+               (do_facet client $LCTL get_param \
+                       osc.$FSNAME-OST0000-osc-*/state;
+                   error "eviction happened: $evict before:$before")
+}
+run_test 132 "long punch"
+
+test_131() {
+       remote_ost_nodsh && skip "remote OST with nodsh" && return 0
+
+       rm -f $DIR/$tfile
+       # get a lock on client so that export would reach the stale list
+       $SETSTRIPE -i 0 $DIR/$tfile || error "setstripe failed"
+       dd if=/dev/zero of=$DIR/$tfile count=1 || error "dd failed"
+
+       # another IO under the same lock
+       #define OBD_FAIL_OSC_DELAY_IO            0x414
+       $LCTL set_param fail_loc=0x80000414
+       dd if=/dev/zero of=$DIR/$tfile count=1 conv=notrunc oflag=dsync &
+       local pid=$!
+       sleep 1
+
+       #define OBD_FAIL_LDLM_BL_EVICT           0x31e
+       set_nodes_failloc "$(osts_nodes)" 0x8000031e
+       ost_evict_client
+       client_reconnect
+
+       wait $pid && error "dd succeeded"
+       return 0
+}
+run_test 131 "IO vs evict results to IO under staled lock"
+
+test_133() {
+       local list=$(comma_list $(mdts_nodes))
+
+       local t=$((TIMEOUT * 2))
+       touch $DIR/$tfile
+
+       flock $DIR/$tfile -c "echo bl lock;sleep $t;echo bl flock unlocked" &
+       sleep 1
+       multiop_bg_pause $DIR/$tfile O_jc || return 1
+       PID=$!
+
+       #define OBD_FAIL_LDLM_REPLY              0x30c
+       do_nodes $list $LCTL set_param fail_loc=0x8000030c
+       kill -USR1 $PID
+       echo "waiting for multiop $PID"
+       wait $PID || return 2
+
+       rm -f $DIR/$tfile
+
+       return 0
+}
+run_test 133 "don't fail on flock resend"
+
 complete $SECONDS
 check_and_cleanup_lustre
 exit_status