Whamcloud - gitweb
LU-2194 test: remove test_19b from except list
[fs/lustre-release.git] / lustre / tests / recovery-small.sh
index cf7a5ae..f7cd763 100755 (executable)
@@ -20,8 +20,8 @@ require_dsh_mds || exit 0
 [ "$SLOW" = "no" ] && EXCEPT_SLOW="17  26a  26b    50   51     57"
 
 [ $(facet_fstype $SINGLEMDS) = "zfs" ] &&
-# bug number for skipped test:       LU-2194 LU-2547
-       ALWAYS_EXCEPT="$ALWAYS_EXCEPT 19b     24a 24b"
+# bug number for skipped test:       LU-2547
+       ALWAYS_EXCEPT="$ALWAYS_EXCEPT 24a 24b"
 
 build_test_filter
 
@@ -149,21 +149,91 @@ test_9() {
 run_test 9 "pause bulk on OST (bug 1420)"
 
 #bug 1521
-test_10() {
-       do_facet client mcreate $DIR/$tfile ||
-               { error "mcreate failed: $?"; return 1; }
-       drop_bl_callback "chmod 0777 $DIR/$tfile"  || echo "evicted as expected"
-       # wait for the mds to evict the client
-       #echo "sleep $(($TIMEOUT*2))"
-       #sleep $(($TIMEOUT*2))
-       do_facet client touch $DIR/$tfile || echo "touch failed, evicted"
-       do_facet client checkstat -v -p 0777 $DIR/$tfile ||
-               { error "client checkstat failed: $?"; return 3; }
-       do_facet client "munlink $DIR/$tfile"
-       # allow recovery to complete
-       client_up || client_up || sleep $TIMEOUT
+test_10a() {
+       local before=$(date +%s)
+       local evict
+
+       do_facet client "stat $DIR > /dev/null"  ||
+               error "failed to stat $DIR: $?"
+       drop_bl_callback "chmod 0777 $DIR" ||
+               error "failed to chmod $DIR: $?"
+
+       # let the client reconnect
+       client_reconnect
+       evict=$(do_facet client $LCTL get_param mdc.$FSNAME-MDT*.state |
+         awk -F"[ [,]" '/EVICTED ]$/ { if (mx<$5) {mx=$5;} } END { print mx }')
+       [ ! -z "$evict" ] && [[ $evict -gt $before ]] ||
+               (do_facet client $LCTL get_param mdc.$FSNAME-MDT*.state;
+                   error "no eviction: $evict before:$before")
+
+       do_facet client checkstat -v -p 0777 $DIR ||
+               error "client checkstat failed: $?"
+}
+run_test 10a "finish request on server after client eviction (bug 1521)"
+
+test_10b() {
+       local before=$(date +%s)
+       local evict
+
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.53) ]] &&
+               skip "Need MDS version at least 2.6.53" && return
+       do_facet client "stat $DIR > /dev/null"  ||
+               error "failed to stat $DIR: $?"
+       drop_bl_callback_once "chmod 0777 $DIR" ||
+               error "failed to chmod $DIR: $?"
+
+       # let the client reconnect
+       client_reconnect
+       evict=$(do_facet client $LCTL get_param mdc.$FSNAME-MDT*.state |
+         awk -F"[ [,]" '/EVICTED ]$/ { if (mx<$5) {mx=$5;} } END { print mx }')
+
+       [ -z "$evict" ] || [[ $evict -le $before ]] ||
+               (do_facet client $LCTL get_param mdc.$FSNAME-MDT*.state;
+                   error "eviction happened: $evict before:$before")
+
+       do_facet client checkstat -v -p 0777 $DIR ||
+               error "client checkstat failed: $?"
 }
-run_test 10 "finish request on server after client eviction (bug 1521)"
+run_test 10b "re-send BL AST"
+
+test_10d() {
+       local before=$(date +%s)
+       local evict
+
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.90) ]] &&
+               skip "Need MDS version at least 2.6.90" && return
+
+       # sleep 1 is to make sure that BEFORE is not equal to EVICTED below
+       sleep 1
+       rm -f $TMP/$tfile
+       echo -n ", world" | dd of=$TMP/$tfile bs=1c seek=5
+
+       mount_client $MOUNT2
+
+       $LFS setstripe -i 0 -c 1 $DIR1/$tfile
+       echo -n hello > $DIR1/$tfile
+
+       stat $DIR2/$tfile >& /dev/null
+       $LCTL set_param fail_err=71
+       drop_bl_callback_once "echo -n \\\", world\\\" >> $DIR2/$tfile"
+
+       client_reconnect
+
+       cmp $DIR1/$tfile $DIR2/$tfile || error "file contents differ"
+       cmp $DIR1/$tfile $TMP/$tfile || error "wrong content found"
+
+       evict=$(do_facet client $LCTL get_param osc.$FSNAME-OST0000*.state | \
+               tr -d '\-\[\] ' | \
+         awk -F"[ [,]" '/EVICTED$/ { if (mx<$1) {mx=$1;} } END { print mx }')
+
+       [[ $evict -gt $before ]] ||
+               (do_facet client $LCTL get_param osc.$FSNAME-OST0000*.state;
+                   error "no eviction: $evict before:$before")
+
+       rm $TMP/$tfile
+       umount_client $MOUNT2
+}
+run_test 10d "test failed blocking ast"
 
 #bug 2460
 # wake up a thread waiting for completion after eviction
@@ -177,7 +247,8 @@ test_11(){
 
        do_facet client $MULTIOP $DIR/$tfile or  ||
                { error "multiop read failed: $?"; return 3; }
-       drop_bl_callback $MULTIOP $DIR/$tfile Ow || echo "evicted as expected"
+       drop_bl_callback_once $MULTIOP $DIR/$tfile Ow ||
+               echo "evicted as expected"
 
        do_facet client munlink $DIR/$tfile ||
                { error "munlink failed: $?"; return 4; }
@@ -428,8 +499,9 @@ test_19a() {
 
        # let the client reconnect
        client_reconnect
-       EVICT=$(do_facet client $LCTL get_param mdc.$FSNAME-MDT*.state | \
-           awk -F"[ [,]" '/EVICTED]$/ { if (mx<$4) {mx=$4;} } END { print mx }')
+       EVICT=$(do_facet client $LCTL get_param mdc.$FSNAME-MDT*.state |
+               awk -F"[ [,]" '/EVICTED ]$/ \
+                       { if (mx<$5) {mx=$5;} } END { print mx }')
 
        [ ! -z "$EVICT" ] && [[ $EVICT -gt $BEFORE ]] ||
                (do_facet client $LCTL get_param mdc.$FSNAME-MDT*.state;
@@ -457,8 +529,9 @@ test_19b() {
 
        # let the client reconnect
        client_reconnect
-       EVICT=$(do_facet client $LCTL get_param osc.$FSNAME-OST*.state | \
-           awk -F"[ [,]" '/EVICTED]$/ { if (mx<$4) {mx=$4;} } END { print mx }')
+       EVICT=$(do_facet client $LCTL get_param osc.$FSNAME-OST*.state |
+               awk -F"[ [,]" '/EVICTED ]$/ \
+                       { if (mx < $5) {mx = $5;} } END { print mx }')
 
        [ ! -z "$EVICT" ] && [[ $EVICT -gt $BEFORE ]] ||
                (do_facet client $LCTL get_param osc.$FSNAME-OST*.state;
@@ -490,7 +563,7 @@ test_19c() {
        # let the client reconnect
        sleep 5
        EVICT=$(do_facet client $LCTL get_param mdc.$FSNAME-MDT*.state |
-          awk -F"[ [,]" '/EVICTED]$/ { if (mx<$4) {mx=$4;} } END { print mx }')
+         awk -F"[ [,]" '/EVICTED ]$/ { if (mx<$5) {mx=$5;} } END { print mx }')
 
        [ -z "$EVICT" ] || [[ $EVICT -le $BEFORE ]] || error "eviction happened"
 }
@@ -909,7 +982,8 @@ run_test 27 "fail LOV while using OSC's"
 
 test_28() {      # bug 6086 - error adding new clients
        do_facet client mcreate $DIR/$tfile       || return 1
-       drop_bl_callback "chmod 0777 $DIR/$tfile" ||echo "evicted as expected"
+       drop_bl_callback_once "chmod 0777 $DIR/$tfile" ||
+               echo "evicted as expected"
        #define OBD_FAIL_MDS_CLIENT_ADD 0x12f
        do_facet $SINGLEMDS "lctl set_param fail_loc=0x8000012f"
        # fail once (evicted), reconnect fail (fail_loc), ok
@@ -1123,11 +1197,11 @@ test_56() { # b=11277
 #define OBD_FAIL_MDS_RESEND      0x136
         touch $DIR/$tfile
         do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000136"
-        stat $DIR/$tfile
+        stat $DIR/$tfile || error "stat failed"
         do_facet $SINGLEMDS "lctl set_param fail_loc=0"
         rm -f $DIR/$tfile
 }
-run_test 56 "do not allow reconnect to busy exports"
+run_test 56 "do not fail on getattr resend"
 
 test_57_helper() {
         # no oscs means no client or mdt 
@@ -1161,10 +1235,10 @@ test_58() { # bug 11546
         pid=$!
         sleep 1
         lctl set_param fail_loc=0
-        drop_bl_callback rm -f $DIR/$tfile
+        drop_bl_callback_once rm -f $DIR/$tfile
         wait $pid
         # the first 'df' could tigger the eviction caused by
-        # 'drop_bl_callback', and it's normal case.
+        # 'drop_bl_callback_once', and it's normal case.
         # but the next 'df' should return successfully.
         do_facet client "df $DIR" || do_facet client "df $DIR"
 }
@@ -1566,10 +1640,9 @@ test_105()
         # get one of the clients from client list
         local rcli=$(echo $RCLIENTS |cut -d' ' -f 1)
 
-        local old_MOUNTOPT=$MOUNTOPT
-        MOUNTOPT=${MOUNTOPT},noir
+        local mount_opts=${MOUNT_OPTS:+$MOUNT_OPTS,}noir
         zconf_umount $rcli $MOUNT || error "umount failed"
-        zconf_mount $rcli $MOUNT || error "mount failed"
+        zconf_mount $rcli $MOUNT $mount_opts || error "mount failed"
 
         # make sure lustre mount at $rcli disabling IR
         local ir_state=$(check_cli_ir_state $rcli)
@@ -1591,8 +1664,7 @@ test_105()
        [ $ir_state = "DISABLED" -o $ir_state = "OFF" ] ||
                error "IR status on ost1 should be DISABLED"
 
-        # restore it
-        MOUNTOPT=$old_MOUNTOPT
+        # remount with the default MOUNT_OPTS
         zconf_umount $rcli $MOUNT || error "umount failed"
         zconf_mount $rcli $MOUNT || error "mount failed"
 
@@ -1945,6 +2017,36 @@ test_120() {
 }
 run_test 120 "flock race: completion vs. evict"
 
+test_113() {
+       local BEFORE=$(date +%s)
+       local EVICT
+
+       # modify dir so that next revalidate would not obtain UPDATE lock
+       touch $DIR
+
+       # drop 1 reply with UPDATE lock,
+       # resend should not create 2nd lock on server
+       mcreate $DIR/$tfile || error "mcreate failed: $?"
+       drop_ldlm_reply_once "stat $DIR/$tfile" || error "stat failed: $?"
+
+       # 2 BL AST will be sent to client, both must find the same lock,
+       # race them to not get EINVAL for 2nd BL AST
+       #define OBD_FAIL_LDLM_PAUSE_CANCEL2      0x31f
+       $LCTL set_param fail_loc=0x8000031f
+
+       $LCTL set_param ldlm.namespaces.*.early_lock_cancel=0 > /dev/null
+       chmod 0777 $DIR/$tfile || error "chmod failed: $?"
+       $LCTL set_param ldlm.namespaces.*.early_lock_cancel=1 > /dev/null
+
+       # let the client reconnect
+       client_reconnect
+       EVICT=$($LCTL get_param mdc.$FSNAME-MDT*.state |
+         awk -F"[ [,]" '/EVICTED ]$/ { if (mx<$5) {mx=$5;} } END { print mx }')
+
+       [ -z "$EVICT" ] || [[ $EVICT -le $BEFORE ]] || error "eviction happened"
+}
+run_test 113 "ldlm enqueue dropped reply should not cause deadlocks"
+
 complete $SECONDS
 check_and_cleanup_lustre
 exit_status