Whamcloud - gitweb
LU-2547 test: re-enable 24a/b of recovery-small
[fs/lustre-release.git] / lustre / tests / recovery-small.sh
index 51f5e1f..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 ] ||
@@ -2118,6 +2121,123 @@ test_112a() {
 }
 run_test 112a "bulk resend while orignal request is in progress"
 
+test_115_read() {
+       local fail1=$1
+       local fail2=$2
+
+       df $DIR
+       dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
+       cancel_lru_locks osc
+
+       # OST_READ       =  3,
+       $LCTL set_param fail_loc=$fail1 fail_val=3
+       dd of=/dev/null if=$DIR/$tfile bs=4096 count=1 &
+       pid=$!
+       sleep 1
+
+       set_nodes_failloc "$(osts_nodes)" $fail2
+
+       wait $pid || error "dd failed"
+       return 0
+}
+
+test_115_write() {
+       local fail1=$1
+       local fail2=$2
+       local error=$3
+       local fail_val2=${4:-0}
+
+       df $DIR
+       touch $DIR/$tfile
+
+       # OST_WRITE      =  4,
+       $LCTL set_param fail_loc=$fail1 fail_val=4
+       dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 oflag=dsync &
+       pid=$!
+       sleep 1
+
+       df $MOUNT
+       set_nodes_failloc "$(osts_nodes)" $fail2 $fail_val2
+
+       wait $pid
+       rc=$?
+       [ $error -eq 0 ] && [ $rc -ne 0 ] && error "dd error ($rc)"
+       [ $error -ne 0 ] && [ $rc -eq 0 ] && error "dd success"
+       return 0
+}
+
+test_115a() {
+       [ $(lustre_version_code ost1) -lt $(version_code 2.8.50) ] &&
+               skip "need at least 2.8.50 on OST" && return 0
+
+       #define OBD_FAIL_PTLRPC_LONG_REQ_UNLINK  0x51b
+       #define OBD_FAIL_PTLRPC_DROP_BULK        0x51a
+       test_115_read 0x8000051b 0x8000051a
+}
+run_test 115a "read: late REQ MDunlink and no bulk"
+
+test_115b() {
+       [ $(lustre_version_code ost1) -lt $(version_code 2.8.50) ] &&
+               skip "need at least 2.8.50 on OST" && return 0
+
+       #define OBD_FAIL_PTLRPC_LONG_REQ_UNLINK  0x51b
+       #define OBD_FAIL_OST_ENOSPC              0x215
+
+       # 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"
+
+test_115c() {
+       [ $(lustre_version_code ost1) -lt $(version_code 2.8.50) ] &&
+               skip "need at least 2.8.50 on OST" && return 0
+
+       #define OBD_FAIL_PTLRPC_LONG_REPL_UNLINK 0x50f
+       #define OBD_FAIL_PTLRPC_DROP_BULK        0x51a
+       test_115_read 0x8000050f 0x8000051a
+}
+run_test 115c "read: late Reply MDunlink and no bulk"
+
+test_115d() {
+       [ $(lustre_version_code ost1) -lt $(version_code 2.8.50) ] &&
+               skip "need at least 2.8.50 on OST" && return 0
+
+       #define OBD_FAIL_PTLRPC_LONG_REPL_UNLINK 0x50f
+       #define OBD_FAIL_OST_ENOSPC              0x215
+       test_115_write 0x8000050f 0x80000215 0
+}
+run_test 115d "write: late Reply MDunlink and no bulk"
+
+test_115e() {
+       [ $(lustre_version_code ost1) -lt $(version_code 2.8.50) ] &&
+               skip "need at least 2.8.50 on OST" && return 0
+
+       #define OBD_FAIL_PTLRPC_LONG_BULK_UNLINK 0x510
+       #define OBD_FAIL_OST_ALL_REPLY_NET       0x211
+       test_115_read 0x80000510 0x80000211
+}
+run_test 115e "read: late Bulk MDunlink and no reply"
+
+test_115f() {
+       [ $(lustre_version_code ost1) -lt $(version_code 2.8.50) ] &&
+               skip "need at least 2.8.50 on OST" && return 0
+
+       #define OBD_FAIL_PTLRPC_LONG_REQ_UNLINK  0x51b
+       #define OBD_FAIL_OST_ALL_REPLY_NET       0x211
+       test_115_read 0x8000051b 0x80000211
+}
+run_test 115f "read: late REQ MDunlink and no reply"
+
+test_115g() {
+       [ $(lustre_version_code ost1) -lt $(version_code 2.8.50) ] &&
+               skip "need at least 2.8.50 on OST" && return 0
+
+       #define OBD_FAIL_PTLRPC_LONG_BOTH_UNLINK 0x51c
+       test_115_read 0x8000051c 0
+}
+run_test 115g "read: late REQ MDunlink and Reply MDunlink"
+
 # parameters: fail_loc CMD RC
 test_120_reply() {
        local PID
@@ -2258,7 +2378,7 @@ test_130_base() {
 
        # Prevent interference from layout intent RPCs due to
        # asynchronous writeback. These will be tested in 130c below.
-       sync
+       do_nodes ${CLIENTS:-$HOSTNAME} sync
 
        # get only LOOKUP lock on $tdir
        cancel_lru_locks mdc
@@ -2309,7 +2429,7 @@ run_test 130b "enqueue resend on a stale inode"
 test_130c() {
        remote_mds_nodsh && skip "remote MDS with nodsh" && return
 
-       sync
+       do_nodes ${CLIENTS:-$HOSTNAME} sync
        echo XXX > $DIR/$tfile
 
        cancel_lru_locks mdc
@@ -2344,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