Whamcloud - gitweb
LU-4843 mdt: disallow old clients access striped dir
[fs/lustre-release.git] / lustre / tests / recovery-small.sh
index 0cdc7f7..cf7a5ae 100755 (executable)
@@ -264,6 +264,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 +333,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 +366,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 +405,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)"
@@ -1197,8 +1198,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 +1385,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 ])
 }
@@ -1684,9 +1685,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 +1710,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 +1726,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 +1742,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 +1758,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 +1773,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 +1781,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 ()
 {
@@ -1808,6 +1841,110 @@ 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"
+
 complete $SECONDS
 check_and_cleanup_lustre
 exit_status