Whamcloud - gitweb
LU-2194 test: remove test_19b from except list
[fs/lustre-release.git] / lustre / tests / recovery-small.sh
index 420a8f9..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 10 "finish request on server after client eviction (bug 1521)"
+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 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; }
@@ -264,6 +335,7 @@ test_16() {
        sleep $TIMEOUT
        do_facet client "cmp $TMP/$tfile $DIR/$tfile" || return 2
        start_read_ahead
+       rm -f $TMP/$tfile
 }
 run_test 16 "timeout bulk put, don't evict client (2732)"
 
@@ -332,7 +404,7 @@ test_18a() {
     rc=0
     pgcache_empty || rc=2
     $LCTL --device $osc2dev activate
-    rm -f $f
+    rm -f $f $TMP/$tfile
     return $rc
 }
 run_test 18a "manual ost invalidate clears page cache immediately"
@@ -365,7 +437,7 @@ test_18b() {
     # cache after the client reconnects?     
     rc=0
     pgcache_empty || rc=2
-    rm -f $f
+    rm -f $f $TMP/$tfile
     return $rc
 }
 run_test 18b "eviction and reconnect clears page cache (2766)"
@@ -404,7 +476,7 @@ test_18c() {
     # cache after the client reconnects?     
     rc=0
     pgcache_empty || rc=2
-    rm -f $f
+    rm -f $f $TMP/$tfile
     return $rc
 }
 run_test 18c "Dropped connect reply after eviction handing (14755)"
@@ -427,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;
@@ -456,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;
@@ -489,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"
 }
@@ -908,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
@@ -1122,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 
@@ -1160,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"
 }
@@ -1197,8 +1272,8 @@ err17935 () {
 }
 
 test_60() {
-        MDT0=$($LCTL get_param -n mdc.*.mds_server_uuid | \
-           awk '{gsub(/_UUID/,""); print $1}' | head -1)
+       MDT0=$($LCTL get_param -n mdc.*.mds_server_uuid |
+               awk '{ gsub(/_UUID/,""); print $1 }' | head -n1)
 
        NUM_FILES=15000
        mkdir -p $DIR/$tdir
@@ -1384,8 +1459,8 @@ target_instance_match()
 
         local target=${srv}_svc
         local si=$(do_facet $srv lctl get_param -n $obdname.${!target}.instance)
-        local ci=$(lctl get_param -n $cliname.${!target}-${cliname}-*.import | \
-                  awk '/instance/{ print $2 }' |head -1)
+       local ci=$(lctl get_param -n $cliname.${!target}-${cliname}-*.import |
+               awk '/instance/{ print $2 }' | head -n1)
 
         return $([ $si -eq $ci ])
 }
@@ -1565,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)
@@ -1590,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"
 
@@ -1684,9 +1757,17 @@ test_110a () {
        [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
        local remote_dir=$DIR/$tdir/remote_dir
        local MDTIDX=1
+       local num
+
+       #prepare for 110 test, which need set striped dir on remote MDT.
+       for num in $(seq $MDSCOUNT); do
+               do_facet mds$num \
+                       lctl set_param -n mdt.${FSNAME}*.enable_remote_dir=1 \
+                               2>/dev/null
+       done
 
        mkdir -p $DIR/$tdir
-       drop_request "$LFS mkdir -i $MDTIDX $remote_dir" ||
+       drop_request "$LFS mkdir -i $MDTIDX -c2 $remote_dir" ||
                                        error "lfs mkdir failed"
        local diridx=$($GETSTRIPE -M $remote_dir)
        [ $diridx -eq $MDTIDX ] || error "$diridx != $MDTIDX"
@@ -1701,7 +1782,7 @@ test_110b () {
        local MDTIDX=1
 
        mkdir -p $DIR/$tdir
-       drop_reint_reply "$LFS mkdir -i $MDTIDX $remote_dir" ||
+       drop_reint_reply "$LFS mkdir -i $MDTIDX -c2 $remote_dir" ||
                                        error "lfs mkdir failed"
 
        diridx=$($GETSTRIPE -M $remote_dir)
@@ -1717,7 +1798,7 @@ test_110c () {
        local MDTIDX=1
 
        mkdir -p $DIR/$tdir
-       drop_update_reply $((MDTIDX + 1)) "$LFS mkdir -i $MDTIDX $remote_dir" ||
+       drop_update_reply $MDTIDX "$LFS mkdir -i $MDTIDX -c2 $remote_dir" ||
                                                error "lfs mkdir failed"
 
        diridx=$($GETSTRIPE -M $remote_dir)
@@ -1733,7 +1814,7 @@ test_110d () {
        local MDTIDX=1
 
        mkdir -p $DIR/$tdir
-       $LFS mkdir -i $MDTIDX $remote_dir || error "lfs mkdir failed"
+       $LFS mkdir -i $MDTIDX -c2 $remote_dir || error "lfs mkdir failed"
 
        drop_request "rm -rf $remote_dir" || error "rm remote dir failed"
 
@@ -1749,7 +1830,7 @@ test_110e () {
        local MDTIDX=1
 
        mkdir -p $DIR/$tdir
-       $LFS mkdir -i $MDTIDX $remote_dir  || error "lfs mkdir failed"
+       $LFS mkdir -i $MDTIDX -c2 $remote_dir  || error "lfs mkdir failed"
        drop_reint_reply "rm -rf $remote_dir" || error "rm remote dir failed"
 
        rm -rf $DIR/$tdir || error "rmdir failed"
@@ -1764,7 +1845,7 @@ test_110f () {
        local MDTIDX=1
 
        mkdir -p $DIR/$tdir
-       $LFS mkdir -i $MDTIDX $remote_dir || error "lfs mkdir failed"
+       $LFS mkdir -i $MDTIDX -c2 $remote_dir || error "lfs mkdir failed"
        drop_update_reply $MDTIDX "rm -rf $remote_dir" ||
                                        error "rm remote dir failed"
 
@@ -1772,6 +1853,30 @@ test_110f () {
 }
 run_test 110f "remove remote directory: drop slave rep"
 
+test_110g () {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
+       local remote_dir=$DIR/$tdir/remote_dir
+       local MDTIDX=1
+
+       mkdir -p $remote_dir
+
+       createmany -o $remote_dir/f 100
+
+       #define OBD_FAIL_MIGRATE_NET_REP        0x1702
+       do_facet mds$MDTIDX lctl set_param fail_loc=0x1702
+       $LFS mv -M $MDTIDX $remote_dir || error "migrate failed"
+       do_facet mds$MDTIDX lctl set_param fail_loc=0x0
+
+       for file in $(find $remote_dir); do
+               mdt_index=$($LFS getstripe -M $file)
+               [ $mdt_index == $MDTIDX ] ||
+                       error "$file is not on MDT${MDTIDX}"
+       done
+
+       rm -rf $DIR/$tdir || error "rmdir failed"
+}
+run_test 110g "drop reply during migration"
+
 # LU-2844 mdt prepare fail should not cause umount oops
 test_111 ()
 {
@@ -1792,9 +1897,6 @@ run_test 111 "mdd setup fail should not cause umount oops"
 test_112a() {
        remote_ost_nodsh && skip "remote OST with nodsh" && return 0
 
-       [[ $(lustre_version_code ost1) -ge $(version_code 2.5.92) ]] ||
-               { skip "Need OST version at least 2.5.92"; return 0; }
-
        do_facet_random_file client $TMP/$tfile 100K ||
                error_noexit "Create random file $TMP/$tfile"
 
@@ -1811,6 +1913,140 @@ test_112a() {
 }
 run_test 112a "bulk resend while orignal request is in progress"
 
+# parameters: fail_loc CMD RC
+test_120_reply() {
+       local PID
+       local PID2
+       local rc=5
+       local fail
+
+       #define OBD_FAIL_LDLM_CP_CB_WAIT2       0x320
+       #define OBD_FAIL_LDLM_CP_CB_WAIT3       0x321
+       #define OBD_FAIL_LDLM_CP_CB_WAIT4       0x322
+       #define OBD_FAIL_LDLM_CP_CB_WAIT5       0x323
+
+       echo
+       echo -n "** FLOCK REPLY vs. EVICTION race, lock $2"
+       [ "$1" = "CLEANUP" ] &&
+               fail=0x80000320 && echo ", $1 cp first"
+       [ "$1" = "REPLY" ] &&
+               fail=0x80000321 && echo ", $1 cp first"
+       [ "$1" = "DEADLOCK CLEANUP" ] &&
+               fail=0x80000322 && echo " DEADLOCK, CLEANUP cp first"
+       [ "$1" = "DEADLOCK REPLY" ] &&
+               fail=0x80000323 && echo " DEADLOCK, REPLY cp first"
+
+       if [ x"$2" = x"get" ]; then
+               #for TEST lock, take a conflict in advance
+               # sleep longer than evictor to not confuse fail_loc: 2+2+4
+               echo "** Taking conflict **"
+               flocks_test 5 set read sleep 10 $DIR/$tfile &
+               PID2=$!
+
+               sleep 2
+       fi
+
+       $LCTL set_param fail_loc=$fail
+
+       flocks_test 5 $2 write $DIR/$tfile &
+       PID=$!
+
+       sleep 2
+       echo "** Evicting and re-connecting client **"
+       mds_evict_client
+
+       client_reconnect
+
+       if [ x"$2" = x"get" ]; then
+               wait $PID2
+       fi
+
+       wait $PID
+       rc=$?
+
+       # check if the return value is allowed
+       [ $rc -eq $3 ] && rc=0
+
+       $LCTL set_param fail_loc=0
+       return $rc
+}
+
+# a lock is taken, unlock vs. cleanup_resource() race for destroying
+# the ORIGINAL lock.
+test_120_destroy()
+{
+       local PID
+
+       flocks_test 5 set write sleep 4 $DIR/$tfile &
+       PID=$!
+       sleep 2
+
+       # let unlock to sleep in CP CB
+       $LCTL set_param fail_loc=$1
+       sleep 4
+
+       # let cleanup to cleep in CP CB
+       mds_evict_client
+
+       client_reconnect
+
+       wait $PID
+       rc=$?
+
+       $LCTL set_param fail_loc=0
+       return $rc
+}
+
+test_120() {
+       flock_is_enabled || { skip "mount w/o flock enabled" && return; }
+       touch $DIR/$tfile
+
+       test_120_reply "CLEANUP" set 5 || error "SET race failed"
+       test_120_reply "CLEANUP" get 5 || error "GET race failed"
+       test_120_reply "CLEANUP" unlock 5 || error "UNLOCK race failed"
+
+       test_120_reply "REPLY" set 5 || error "SET race failed"
+       test_120_reply "REPLY" get 5 || error "GET race failed"
+       test_120_reply "REPLY" unlock 5 || error "UNLOCK race failed"
+
+       # DEADLOCK tests
+       test_120_reply "DEADLOCK CLEANUP" set 5 || error "DEADLOCK race failed"
+       test_120_reply "DEADLOCK REPLY" set 35 || error "DEADLOCK race failed"
+
+       test_120_destroy 0x320 || error "unlock-cleanup race failed"
+}
+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