X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Freplay-single.sh;h=ada7584051479582283dd1a707ea673fcd881474;hb=c1d465de13ccf0eda8020c88661c3cc4d78538ca;hp=fd6901fa83b03804aa2c266dd9e4bf6afbb4a69b;hpb=0444a40d9838b868092c78d3bdd4c7c3a00199e6;p=fs%2Flustre-release.git diff --git a/lustre/tests/replay-single.sh b/lustre/tests/replay-single.sh index fd6901f..ada7584 100755 --- a/lustre/tests/replay-single.sh +++ b/lustre/tests/replay-single.sh @@ -21,15 +21,16 @@ GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""} require_dsh_mds || exit 0 # Skip these tests -# bug number: 17466 18857 LU-1473 -ALWAYS_EXCEPT="61d 33a 33b 62 $REPLAY_SINGLE_EXCEPT" +# bug number for skipped tests: +ALWAYS_EXCEPT="$REPLAY_SINGLE_EXCEPT " +# UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT! -# 63 min 7 min AT AT AT AT" -[ "$SLOW" = "no" ] && EXCEPT_SLOW="1 2 3 4 6 12 16 44a 44b 65 66 67 68" +# 7.5 (min)" +[ "$SLOW" = "no" ] && EXCEPT_SLOW="44b" [ $(facet_fstype $SINGLEMDS) = "zfs" ] && -# bug number for skipped test: LU-1867 LU-3127 - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 89 73b" +# bug number for skipped test: + ALWAYS_EXCEPT="$ALWAYS_EXCEPT " build_test_filter @@ -118,6 +119,24 @@ test_2b() { } run_test 2b "touch" +test_2c() { + replay_barrier $SINGLEMDS + $LFS setstripe -c $OSTCOUNT $DIR/$tfile + fail $SINGLEMDS + $CHECKSTAT -t file $DIR/$tfile || + error "$CHECKSTAT $DIR/$tfile check failed" +} +run_test 2c "setstripe replay" + +test_2d() { + replay_barrier $SINGLEMDS + $LFS setdirstripe -i 0 -c $MDSCOUNT $DIR/$tdir + fail $SINGLEMDS + $CHECKSTAT -t dir $DIR/$tdir || + error "$CHECKSTAT $DIR/$tdir check failed" +} +run_test 2d "setdirstripe replay" + test_3a() { local file=$DIR/$tfile replay_barrier $SINGLEMDS @@ -447,35 +466,47 @@ run_test 20a "|X| open(O_CREAT), unlink, replay, close (test mds_cleanup_orphans test_20b() { # bug 10480 local wait_timeout=$((TIMEOUT * 4)) - local BEFOREUSED - local AFTERUSED + local extra=$(fs_log_size) + local n_attempts=1 + + sync_all_data + $LFS setstripe -i 0 -c 1 $DIR + + local beforeused=$(df -P $DIR | tail -1 | awk '{ print $3 }') - BEFOREUSED=$(df -P $DIR | tail -1 | awk '{ print $3 }') dd if=/dev/zero of=$DIR/$tfile bs=4k count=10000 & while [ ! -e $DIR/$tfile ] ; do - usleep 60 # give dd a chance to start + usleep 60 # give dd a chance to start done - $GETSTRIPE $DIR/$tfile || error "$GETSTRIPE $DIR/$tfile failed" + $LFS getstripe $DIR/$tfile || error "$LFS getstripe $DIR/$tfile failed" # make it an orphan rm -f $DIR/$tfile || error "rm -f $DIR/$tfile failed" mds_evict_client - client_up || client_up || true # reconnect + client_up || client_up || true # reconnect - do_facet $SINGLEMDS "lctl set_param -n osd*.*MDT*.force_sync 1" + do_facet $SINGLEMDS "lctl set_param -n osd*.*MDT*.force_sync=1" - fail $SINGLEMDS # start orphan recovery + fail $SINGLEMDS # start orphan recovery wait_recovery_complete $SINGLEMDS || error "MDS recovery not done" - wait_delete_completed_mds $wait_timeout || - error "delete did not complete" + wait_delete_completed $wait_timeout || error "delete did not finish" + sync_all_data - AFTERUSED=$(df -P $DIR | tail -1 | awk '{ print $3 }') - log "before $BEFOREUSED, after $AFTERUSED" - (( $AFTERUSED > $BEFOREUSED + $(fs_log_size) )) && - error "after $AFTERUSED > before $BEFOREUSED" - return 0 + while true; do + local afterused=$(df -P $DIR | tail -1 | awk '{ print $3 }') + log "before $beforeused, after $afterused" + + (( $beforeused + $extra >= $afterused )) && break + n_attempts=$((n_attempts + 1)) + [ $n_attempts -gt 3 ] && + error "after $afterused > before $beforeused + $extra" + + wait_zfs_commit $SINGLEMDS 5 + sync_all_data + done } -run_test 20b "write, unlink, eviction, replay, (test mds_cleanup_orphans)" + +run_test 20b "write, unlink, eviction, replay (test mds_cleanup_orphans)" test_20c() { # bug 10480 multiop_bg_pause $DIR/$tfile Ow_c || @@ -908,9 +939,7 @@ run_test 40 "cause recovery in ptlrpc, ensure IO continues" # the page, guarnateeing that the unlock from the RPC completion would # assert on trying to unlock the unlocked page. test_41() { - [ $OSTCOUNT -lt 2 ] && - skip_env "skipping test 41: we don't have a second OST to test with" && - return + [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs" && return local f=$MOUNT/$tfile # make sure the start of the file is ost1 @@ -1116,8 +1145,7 @@ run_test 47 "MDS->OSC failure during precreate cleanup (2824)" test_48() { remote_ost_nodsh && skip "remote OST with nodsh" && return 0 - [ "$OSTCOUNT" -lt "2" ] && - skip_env "$OSTCOUNT < 2 OSTs -- skipping" && return + [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs" && return replay_barrier $SINGLEMDS createmany -o $DIR/$tfile 20 || @@ -1127,6 +1155,10 @@ test_48() { do_facet ost1 "lctl set_param fail_loc=0x80000216" client_up || error "client_up failed" + # let the MDS discover the OST failure, attempt to recover, fail + # and recover again. + sleep $((3 * TIMEOUT)) + createmany -o $DIR/$tfile 20 20 || error "createmany recraete $DIR/$tfile failed" unlinkmany $DIR/$tfile 40 || error "unlinkmany $DIR/$tfile failed" @@ -1177,6 +1209,10 @@ run_test 52 "time out lock replay (3764)" # bug 3462 - simultaneous MDC requests test_53a() { + [[ $(lctl get_param mdc.*.import | + grep "connect_flags:.*multi_mod_rpc") ]] || + { skip "Need MDC with 'multi_mod_rpcs' feature"; return 0; } + cancel_lru_locks mdc # cleanup locks from former test cases mkdir $DIR/${tdir}-1 || error "mkdir $DIR/${tdir}-1 failed" mkdir $DIR/${tdir}-2 || error "mkdir $DIR/${tdir}-2 failed" @@ -1281,6 +1317,10 @@ test_53c() { run_test 53c "|X| open request and close request while two MDC requests in flight" test_53d() { + [[ $(lctl get_param mdc.*.import | + grep "connect_flags:.*multi_mod_rpc") ]] || + { skip "Need MDC with 'multi_mod_rpcs' feature"; return 0; } + cancel_lru_locks mdc # cleanup locks from former test cases mkdir $DIR/${tdir}-1 || error "mkdir $DIR/${tdir}-1 failed" @@ -1488,7 +1528,8 @@ test_57() { touch $DIR/$tfile || error "touch $DIR/$tfile failed" replay_barrier $SINGLEMDS fail $SINGLEMDS - sleep 1 + wait_recovery_complete $SINGLEMDS || error "MDS recovery is not done" + wait_mds_ost_sync || error "wait_mds_ost_sync failed" $CHECKSTAT -t file $DIR/$tfile || error "$CHECKSTAT $DIR/$tfile attribute check failed" do_facet $SINGLEMDS "lctl set_param fail_loc=0x0" @@ -1527,8 +1568,11 @@ test_58b() { large_xattr_enabled && orig="$(generate_string $(max_xattr_size))" || orig="bar" + # Original extended attribute can be long. Print a small version of + # attribute if an error occurs + local sm_msg=$(printf "%.9s" $orig) - mount_client $MOUNT2 + mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed" mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed" touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed" replay_barrier $SINGLEMDS @@ -1536,43 +1580,52 @@ test_58b() { fail $SINGLEMDS new=$(get_xattr_value trusted.foo $MOUNT2/$tdir/$tfile) [[ "$new" = "$orig" ]] || - error "xattr set ($orig) is not what was returned ($new)" + error "xattr set ($sm_msg...) differs from xattr get ($new)" rm -f $DIR/$tdir/$tfile rmdir $DIR/$tdir cleanup_58 + wait_clients_import_state ${CLIENTS:-$HOSTNAME} "mgs" FULL } run_test 58b "test replay of setxattr op" test_58c() { # bug 16570 - local orig - local orig1 - local new - - trap cleanup_58 EXIT - - if large_xattr_enabled; then - local xattr_size=$(max_xattr_size) - orig="$(generate_string $((xattr_size / 2)))" - orig1="$(generate_string $xattr_size)" - else - orig="bar" - orig1="bar1" - fi + local orig + local orig1 + local new + + trap cleanup_58 EXIT + + if large_xattr_enabled; then + local xattr_size=$(max_xattr_size) + orig="$(generate_string $((xattr_size / 2)))" + orig1="$(generate_string $xattr_size)" + else + orig="bar" + orig1="bar1" + fi + + # PING_INTERVAL max(obd_timeout / 4, 1U) + sleep $((TIMEOUT / 4)) - mount_client $MOUNT2 + # Original extended attribute can be long. Print a small version of + # attribute if an error occurs + local sm_msg=$(printf "%.9s" $orig) + local sm_msg1=$(printf "%.9s" $orig1) + + mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed" mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed" touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed" drop_request "setfattr -n trusted.foo -v $orig $DIR/$tdir/$tfile" || error "drop_request for setfattr failed" new=$(get_xattr_value trusted.foo $MOUNT2/$tdir/$tfile) [[ "$new" = "$orig" ]] || - error "xattr set ($orig) is not what was returned ($new)" + error "xattr set ($sm_msg...) differs from xattr get ($new)" drop_reint_reply "setfattr -n trusted.foo1 \ -v $orig1 $DIR/$tdir/$tfile" || - error "drop_request for setfattr failed" + error "drop_reint_reply for setfattr failed" new=$(get_xattr_value trusted.foo1 $MOUNT2/$tdir/$tfile) [[ "$new" = "$orig1" ]] || - error "second xattr set ($orig1) not what was returned ($new)" + error "second xattr set ($sm_msg1...) differs xattr get ($new)" rm -f $DIR/$tdir/$tfile rmdir $DIR/$tdir cleanup_58 @@ -1783,36 +1836,39 @@ run_test 65a "AT: verify early replies" test_65b() #bug 3055 { - remote_ost_nodsh && skip "remote OST with nodsh" && return 0 - - at_start || return 0 - # turn on D_ADAPTTO - debugsave - $LCTL set_param debug="other trace" - $LCTL dk > /dev/null - # Slow down a request to the current service time, this is critical - # because previous tests may have caused this value to increase. - $SETSTRIPE --stripe-index=0 --count=1 $DIR/$tfile - multiop $DIR/$tfile Ow1yc - REQ_DELAY=`lctl get_param -n osc.${FSNAME}-OST0000-osc-*.timeouts | - awk '/portal 6/ {print $5}'` - REQ_DELAY=$((${REQ_DELAY} + ${REQ_DELAY} / 4 + 5)) - - do_facet ost1 lctl set_param fail_val=${REQ_DELAY} -#define OBD_FAIL_OST_BRW_PAUSE_PACK 0x224 - do_facet ost1 $LCTL set_param fail_loc=0x224 + remote_ost_nodsh && skip "remote OST with nodsh" && return 0 - rm -f $DIR/$tfile - $SETSTRIPE --stripe-index=0 --count=1 $DIR/$tfile - # force some real bulk transfer - multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c + at_start || return 0 + # turn on D_ADAPTTO + debugsave + $LCTL set_param debug="other trace" + $LCTL dk > /dev/null + # Slow down a request to the current service time, this is critical + # because previous tests may have caused this value to increase. + $SETSTRIPE --stripe-index=0 --stripe-count=1 $DIR/$tfile || + error "$SETSTRIPE failed for $DIR/$tfile" + + multiop $DIR/$tfile Ow1yc + REQ_DELAY=`lctl get_param -n osc.${FSNAME}-OST0000-osc-*.timeouts | + awk '/portal 6/ {print $5}'` + REQ_DELAY=$((${REQ_DELAY} + ${REQ_DELAY} / 4 + 5)) + + do_facet ost1 lctl set_param fail_val=${REQ_DELAY} + #define OBD_FAIL_OST_BRW_PAUSE_PACK 0x224 + do_facet ost1 $LCTL set_param fail_loc=0x224 - do_facet ost1 $LCTL set_param fail_loc=0 - # check for log message - $LCTL dk | grep "Early reply #" || error "No early reply" - debugrestore - # client should show REQ_DELAY estimates - lctl get_param -n osc.${FSNAME}-OST0000-osc-*.timeouts | grep portal + rm -f $DIR/$tfile + $SETSTRIPE --stripe-index=0 --stripe-count=1 $DIR/$tfile || + error "$SETSTRIPE failed" + # force some real bulk transfer + multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c + + do_facet ost1 $LCTL set_param fail_loc=0 + # check for log message + $LCTL dk | grep "Early reply #" || error "No early reply" + debugrestore + # client should show REQ_DELAY estimates + lctl get_param -n osc.${FSNAME}-OST0000-osc-*.timeouts | grep portal } run_test 65b "AT: verify early replies on packed reply / bulk" @@ -1856,7 +1912,7 @@ test_66b() #bug 3055 $LCTL set_param fail_val=$(($ORIG + 5)) #define OBD_FAIL_PTLRPC_PAUSE_REP 0x50c $LCTL set_param fail_loc=0x50c - ls $DIR/$tfile > /dev/null 2>&1 + touch $DIR/$tfile > /dev/null 2>&1 $LCTL set_param fail_loc=0 CUR=$(lctl get_param -n mdc.${FSNAME}-MDT0000*.timeouts | awk '/network/ {print $4}') @@ -1948,20 +2004,21 @@ test_68 () #bug 13813 do_facet ost1 "echo $TIMEOUT >> $ldlm_enqueue_min_r" mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed" - $SETSTRIPE --stripe-index=0 --count=1 $DIR/$tdir -#define OBD_FAIL_LDLM_PAUSE_CANCEL 0x312 - $LCTL set_param fail_val=$(($TIMEOUT - 1)) - $LCTL set_param fail_loc=0x80000312 - cp /etc/profile $DIR/$tdir/${tfile}_1 || error "1st cp failed $?" - $LCTL set_param fail_val=$((TIMEOUT * 5 / 4)) - $LCTL set_param fail_loc=0x80000312 - cp /etc/profile $DIR/$tdir/${tfile}_2 || error "2nd cp failed $?" - $LCTL set_param fail_loc=0 - - echo $ENQ_MIN >> $ldlm_enqueue_min - do_facet ost1 "echo $ENQ_MIN_R >> $ldlm_enqueue_min_r" - rm -rf $DIR/$tdir - return 0 + $SETSTRIPE --stripe-index=0 -c 1 $DIR/$tdir || + error "$SETSTRIPE failed for $DIR/$tdir" + #define OBD_FAIL_LDLM_PAUSE_CANCEL 0x312 + $LCTL set_param fail_val=$(($TIMEOUT - 1)) + $LCTL set_param fail_loc=0x80000312 + cp /etc/profile $DIR/$tdir/${tfile}_1 || error "1st cp failed $?" + $LCTL set_param fail_val=$((TIMEOUT * 5 / 4)) + $LCTL set_param fail_loc=0x80000312 + cp /etc/profile $DIR/$tdir/${tfile}_2 || error "2nd cp failed $?" + $LCTL set_param fail_loc=0 + + echo $ENQ_MIN >> $ldlm_enqueue_min + do_facet ost1 "echo $ENQ_MIN_R >> $ldlm_enqueue_min_r" + rm -rf $DIR/$tdir + return 0 } run_test 68 "AT: verify slowing locks" @@ -2006,15 +2063,6 @@ check_for_process () { killall_process $clients "$prog" -0 } -killall_process () { - local clients=${1:-$(hostname)} - local name=$2 - local signal=$3 - local rc=0 - - do_nodes $clients "killall $signal $name" -} - test_70b () { local clients=${CLIENTS:-$HOSTNAME} @@ -2029,6 +2077,10 @@ test_70b () { local start_ts=$(date +%s) local cmd="rundbench 1 -t $duration" local pid="" + if [ $MDSCOUNT -ge 2 ]; then + test_mkdir -p -c$MDSCOUNT $DIR/$tdir + $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir + fi do_nodesv $clients "set -x; MISSING_DBENCH_OK=$MISSING_DBENCH_OK \ PATH=\$PATH:$LUSTRE/utils:$LUSTRE/tests/:$DBENCH_LIB \ DBENCH_LIB=$DBENCH_LIB TESTSUITE=$TESTSUITE TESTNAME=$TESTNAME \ @@ -2049,6 +2101,7 @@ test_70b () { elapsed=$(($(date +%s) - start_ts)) local num_failovers=0 + local fail_index=1 while [ $elapsed -lt $duration ]; do if ! check_for_process $clients dbench; then error_noexit "dbench stopped on some of $clients!" @@ -2056,20 +2109,421 @@ test_70b () { break fi sleep 1 - replay_barrier $SINGLEMDS + replay_barrier mds$fail_index sleep 1 # give clients a time to do operations # Increment the number of failovers num_failovers=$((num_failovers+1)) - log "$TESTNAME fail $SINGLEMDS $num_failovers times" - fail $SINGLEMDS + log "$TESTNAME fail mds$fail_index $num_failovers times" + fail mds$fail_index elapsed=$(($(date +%s) - start_ts)) + if [ $fail_index -ge $MDSCOUNT ]; then + fail_index=1 + else + fail_index=$((fail_index+1)) + fi done wait $pid || error "rundbench load on $clients failed!" } -run_test 70b "mds recovery; $CLIENTCOUNT clients" +run_test 70b "dbench ${MDSCOUNT}mdts recovery; $CLIENTCOUNT clients" # end multi-client tests +random_fail_mdt() { + local max_index=$1 + local duration=$2 + local monitor_pid=$3 + local elapsed + local start_ts=$(date +%s) + local num_failovers=0 + local fail_index + + elapsed=$(($(date +%s) - start_ts)) + while [ $elapsed -lt $duration ]; do + fail_index=$((RANDOM%max_index+1)) + kill -0 $monitor_pid || + error "$monitor_pid stopped" + sleep 120 + replay_barrier mds$fail_index + sleep 10 + # Increment the number of failovers + num_failovers=$((num_failovers+1)) + log "$TESTNAME fail mds$fail_index $num_failovers times" + fail mds$fail_index + elapsed=$(($(date +%s) - start_ts)) + done +} + +cleanup_70c() { + trap 0 + rm -f $DIR/replay-single.70c.lck + rm -rf /$DIR/$tdir +} + +test_70c () { + local clients=${CLIENTS:-$HOSTNAME} + local rc=0 + + zconf_mount_clients $clients $MOUNT + + local duration=300 + [ "$SLOW" = "no" ] && duration=180 + # set duration to 900 because it takes some time to boot node + [ "$FAILURE_MODE" = HARD ] && duration=600 + + local elapsed + local start_ts=$(date +%s) + + trap cleanup_70c EXIT + ( + while [ ! -e $DIR/replay-single.70c.lck ]; do + test_mkdir -p -c$MDSCOUNT $DIR/$tdir || break + if [ $MDSCOUNT -ge 2 ]; then + $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir || + error "set default dirstripe failed" + fi + cd $DIR/$tdir || break + tar cf - /etc | tar xf - || error "tar failed in loop" + done + )& + tar_70c_pid=$! + echo "Started tar $tar_70c_pid" + + random_fail_mdt $MDSCOUNT $duration $tar_70c_pid + kill -0 $tar_70c_pid || error "tar $tar_70c_pid stopped" + + touch $DIR/replay-single.70c.lck + wait $tar_70c_pid || error "$?: tar failed" + + cleanup_70c + true +} +run_test 70c "tar ${MDSCOUNT}mdts recovery" + +cleanup_70d() { + trap 0 + kill -9 $mkdir_70d_pid +} + +test_70d () { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + local clients=${CLIENTS:-$HOSTNAME} + local rc=0 + + zconf_mount_clients $clients $MOUNT + + local duration=300 + [ "$SLOW" = "no" ] && duration=180 + # set duration to 900 because it takes some time to boot node + [ "$FAILURE_MODE" = HARD ] && duration=900 + + mkdir -p $DIR/$tdir + + local elapsed + local start_ts=$(date +%s) + + trap cleanup_70d EXIT + ( + while true; do + $LFS mkdir -i0 -c2 $DIR/$tdir/test || { + echo "mkdir fails" + break + } + $LFS mkdir -i1 -c2 $DIR/$tdir/test1 || { + echo "mkdir fails" + break + } + + touch $DIR/$tdir/test/a || { + echo "touch fails" + break; + } + mkdir $DIR/$tdir/test/b || { + echo "mkdir fails" + break; + } + rm -rf $DIR/$tdir/test || { + echo "rmdir fails" + break + } + + touch $DIR/$tdir/test1/a || { + echo "touch fails" + break; + } + mkdir $DIR/$tdir/test1/b || { + echo "mkdir fails" + break; + } + + rm -rf $DIR/$tdir/test1 || { + echo "rmdir fails" + break + } + done + )& + mkdir_70d_pid=$! + echo "Started $mkdir_70d_pid" + + random_fail_mdt $MDSCOUNT $duration $mkdir_70d_pid + kill -0 $mkdir_70d_pid || error "mkdir/rmdir $mkdir_70d_pid stopped" + + cleanup_70d + true +} +run_test 70d "mkdir/rmdir striped dir ${MDSCOUNT}mdts recovery" + +cleanup_70e() { + trap 0 + kill -9 $rename_70e_pid +} + +test_70e () { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + local clients=${CLIENTS:-$HOSTNAME} + local rc=0 + + echo ha > /proc/sys/lnet/debug + zconf_mount_clients $clients $MOUNT + + local duration=300 + [ "$SLOW" = "no" ] && duration=180 + # set duration to 900 because it takes some time to boot node + [ "$FAILURE_MODE" = HARD ] && duration=900 + + mkdir -p $DIR/$tdir + $LFS mkdir -i0 $DIR/$tdir/test_0 + $LFS mkdir -i0 $DIR/$tdir/test_1 + touch $DIR/$tdir/test_0/a + touch $DIR/$tdir/test_1/b + trap cleanup_70e EXIT + ( + while true; do + mrename $DIR/$tdir/test_0/a $DIR/$tdir/test_1/b > \ + /dev/null || { + echo "a->b fails" + break; + } + + checkstat $DIR/$tdir/test_0/a && { + echo "a still exists" + break + } + + checkstat $DIR/$tdir/test_1/b || { + echo "b still exists" + break + } + + touch $DIR/$tdir/test_0/a || { + echo "touch a fails" + break + } + + mrename $DIR/$tdir/test_1/b $DIR/$tdir/test_0/a > \ + /dev/null || { + echo "a->a fails" + break; + } + done + )& + rename_70e_pid=$! + echo "Started $rename_70e_pid" + + random_fail_mdt 2 $duration $rename_70e_pid + kill -0 $rename_70e_pid || error "rename $rename_70e_pid stopped" + + cleanup_70e + true +} +run_test 70e "rename cross-MDT with random fails" + +test_70f_write_and_read(){ + local srcfile=$1 + local stopflag=$2 + local client + + echo "Write/read files in: '$DIR/$tdir', clients: '$CLIENTS' ..." + for client in ${CLIENTS//,/ }; do + [ -f $stopflag ] || return + + local tgtfile=$DIR/$tdir/$tfile.$client + do_node $client dd $DD_OPTS bs=1M count=10 if=$srcfile \ + of=$tgtfile 2>/dev/null || + error "dd $DD_OPTS bs=1M count=10 if=$srcfile " \ + "of=$tgtfile failed on $client, rc=$?" + done + + local prev_client=$(echo ${CLIENTS//,/ } | awk '{ print $NF }') + local index=0 + + for client in ${CLIENTS//,/ }; do + [ -f $stopflag ] || return + + # flush client cache in case test is running on only one client + # do_node $client cancel_lru_locks osc + do_node $client $LCTL set_param ldlm.namespaces.*.lru_size=clear + + tgtfile=$DIR/$tdir/$tfile.$client + local md5=$(do_node $prev_client "md5sum $tgtfile") + [ ${checksum[$index]// */} = ${md5// */} ] || + error "$tgtfile: checksum doesn't match on $prev_client" + index=$((index + 1)) + prev_client=$client + done +} + +test_70f_loop(){ + local srcfile=$1 + local stopflag=$2 + DD_OPTS= + + mkdir -p $DIR/$tdir || error "cannot create $DIR/$tdir directory" + $SETSTRIPE -c -1 $DIR/$tdir || error "cannot $SETSTRIPE $DIR/$tdir" + + touch $stopflag + while [ -f $stopflag ]; do + test_70f_write_and_read $srcfile $stopflag + # use direct IO and buffer cache in turns if loop + [ -n "$DD_OPTS" ] && DD_OPTS="" || DD_OPTS="oflag=direct" + done +} + +test_70f_cleanup() { + trap 0 + rm -f $TMP/$tfile.stop + do_nodes $CLIENTS rm -f $TMP/$tfile + rm -f $DIR/$tdir/$tfile.* +} + +test_70f() { +# [ x$ost1failover_HOST = x$ost_HOST ] && +# { skip "Failover host not defined" && return; } +# [ -z "$CLIENTS" ] && +# { skip "CLIENTS are not specified." && return; } +# [ $CLIENTCOUNT -lt 2 ] && +# { skip "Need 2 or more clients, have $CLIENTCOUNT" && return; } + + [[ $(lustre_version_code ost1) -lt $(version_code 2.9.53) ]] && + skip "Need server version at least 2.9.53" && return + + echo "mount clients $CLIENTS ..." + zconf_mount_clients $CLIENTS $MOUNT + + local srcfile=$TMP/$tfile + local client + local index=0 + + trap test_70f_cleanup EXIT + # create a different source file local to each client node so we can + # detect if the file wasn't written out properly after failover + do_nodes $CLIENTS dd bs=1M count=10 if=/dev/urandom of=$srcfile \ + 2>/dev/null || error "can't create $srcfile on $CLIENTS" + for client in ${CLIENTS//,/ }; do + checksum[$index]=$(do_node $client "md5sum $srcfile") + index=$((index + 1)) + done + + local duration=120 + [ "$SLOW" = "no" ] && duration=60 + # set duration to 900 because it takes some time to boot node + [ "$FAILURE_MODE" = HARD ] && duration=900 + + local stopflag=$TMP/$tfile.stop + test_70f_loop $srcfile $stopflag & + local pid=$! + + local elapsed=0 + local num_failovers=0 + local start_ts=$SECONDS + while [ $elapsed -lt $duration ]; do + sleep 3 + replay_barrier ost1 + sleep 1 + num_failovers=$((num_failovers + 1)) + log "$TESTNAME failing OST $num_failovers times" + fail ost1 + sleep 2 + elapsed=$((SECONDS - start_ts)) + done + + rm -f $stopflag + wait $pid + test_70f_cleanup +} +run_test 70f "OSS O_DIRECT recovery with $CLIENTCOUNT clients" + +cleanup_71a() { + trap 0 + kill -9 $mkdir_71a_pid +} + +random_double_fail_mdt() { + local max_index=$1 + local duration=$2 + local monitor_pid=$3 + local elapsed + local start_ts=$(date +%s) + local num_failovers=0 + local fail_index + local second_index + + elapsed=$(($(date +%s) - start_ts)) + while [ $elapsed -lt $duration ]; do + fail_index=$((RANDOM%max_index + 1)) + if [ $fail_index -eq $max_index ]; then + second_index=1 + else + second_index=$((fail_index + 1)) + fi + kill -0 $monitor_pid || + error "$monitor_pid stopped" + sleep 120 + replay_barrier mds$fail_index + replay_barrier mds$second_index + sleep 10 + # Increment the number of failovers + num_failovers=$((num_failovers+1)) + log "fail mds$fail_index mds$second_index $num_failovers times" + fail mds${fail_index},mds${second_index} + elapsed=$(($(date +%s) - start_ts)) + done +} + +test_71a () { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + local clients=${CLIENTS:-$HOSTNAME} + local rc=0 + + zconf_mount_clients $clients $MOUNT + + local duration=300 + [ "$SLOW" = "no" ] && duration=180 + # set duration to 900 because it takes some time to boot node + [ "$FAILURE_MODE" = HARD ] && duration=900 + + mkdir -p $DIR/$tdir + + local elapsed + local start_ts=$(date +%s) + + trap cleanup_71a EXIT + ( + while true; do + $LFS mkdir -i0 -c2 $DIR/$tdir/test + rmdir $DIR/$tdir/test + done + )& + mkdir_71a_pid=$! + echo "Started $mkdir_71a_pid" + + random_double_fail_mdt 2 $duration $mkdir_71a_pid + kill -0 $mkdir_71a_pid || error "mkdir/rmdir $mkdir_71a_pid stopped" + + cleanup_71a + true +} +run_test 71a "mkdir/rmdir striped dir with 2 mdts recovery" + test_73a() { multiop_bg_pause $DIR/$tfile O_tSc || error "multiop_bg_pause $DIR/$tfile failed" @@ -2122,11 +2576,16 @@ run_test 74 "Ensure applications don't fail waiting for OST recovery" remote_dir_check_80() { local MDTIDX=1 - local diridx=$($GETSTRIPE -M $remote_dir) + local diridx + local fileidx + + diridx=$($GETSTRIPE -M $remote_dir) || + error "$GETSTRIPE -M $remote_dir failed" [ $diridx -eq $MDTIDX ] || error "$diridx != $MDTIDX" createmany -o $remote_dir/f-%d 20 || error "creation failed" - local fileidx=$($GETSTRIPE -M $remote_dir/f-1) + fileidx=$($GETSTRIPE -M $remote_dir/f-1) || + error "$GETSTRIPE -M $remote_dir/f-1 failed" [ $fileidx -eq $MDTIDX ] || error "$fileidx != $MDTIDX" return 0 @@ -2148,6 +2607,7 @@ test_80a() { $LFS mkdir -i $MDTIDX $remote_dir & local CLIENT_PID=$! + replay_barrier mds1 fail mds${MDTIDX} wait $CLIENT_PID || error "remote creation failed" @@ -2175,6 +2635,8 @@ test_80b() { $LFS mkdir -i $MDTIDX $remote_dir & local CLIENT_PID=$! + replay_barrier mds1 + replay_barrier mds2 fail mds$((MDTIDX + 1)) wait $CLIENT_PID || error "remote creation failed" @@ -2202,6 +2664,8 @@ test_80c() { $LFS mkdir -i $MDTIDX $remote_dir & local CLIENT_PID=$! + replay_barrier mds1 + replay_barrier mds2 fail mds${MDTIDX} fail mds$((MDTIDX + 1)) @@ -2228,6 +2692,9 @@ test_80d() { # sleep 3 seconds to make sure MDTs are failed after # lfs mkdir -i has finished on all of MDTs. sleep 3 + + replay_barrier mds1 + replay_barrier mds2 fail mds${MDTIDX},mds$((MDTIDX + 1)) wait $CLIENT_PID || error "remote creation failed" @@ -2259,6 +2726,7 @@ test_80e() { # lfs mkdir -i has finished on all of MDTs. sleep 3 + replay_barrier mds1 fail mds${MDTIDX} wait $CLIENT_PID || error "remote creation failed" @@ -2285,6 +2753,7 @@ test_80f() { $LFS mkdir -i $MDTIDX $remote_dir & local CLIENT_PID=$! + replay_barrier mds2 fail mds$((MDTIDX + 1)) wait $CLIENT_PID || error "remote creation failed" @@ -2316,6 +2785,8 @@ test_80g() { # lfs mkdir -i has finished on all of MDTs. sleep 3 + replay_barrier mds1 + replay_barrier mds2 fail mds${MDTIDX} fail mds$((MDTIDX + 1)) @@ -2343,6 +2814,8 @@ test_80h() { # lfs mkdir -i has finished on all of MDTs. sleep 3 + replay_barrier mds1 + replay_barrier mds2 fail mds${MDTIDX},mds$((MDTIDX + 1)) wait $CLIENT_PID || error "remote dir creation failed" @@ -2373,11 +2846,12 @@ test_81a() { rmdir $remote_dir & local CLIENT_PID=$! + replay_barrier mds2 fail mds$((MDTIDX + 1)) wait $CLIENT_PID || error "rm remote dir failed" - stat $remote_dir 2&>/dev/null && error "$remote_dir still exist!" + stat $remote_dir &>/dev/null && error "$remote_dir still exist!" rm -rf $DIR/$tdir || error "rmdir failed" @@ -2402,11 +2876,12 @@ test_81b() { rmdir $remote_dir & local CLIENT_PID=$! + replay_barrier mds1 fail mds${MDTIDX} wait $CLIENT_PID || error "rm remote dir failed" - stat $remote_dir 2&>/dev/null && error "$remote_dir still exist!" + stat $remote_dir &>/dev/null && error "$remote_dir still exist!" rm -rf $DIR/$tdir || error "rmdir failed" @@ -2432,12 +2907,14 @@ test_81c() { rmdir $remote_dir & local CLIENT_PID=$! + replay_barrier mds1 + replay_barrier mds2 fail mds${MDTIDX} fail mds$((MDTIDX + 1)) wait $CLIENT_PID || error "rm remote dir failed" - stat $remote_dir 2&>/dev/null && error "$remote_dir still exist!" + stat $remote_dir &>/dev/null && error "$remote_dir still exist!" rm -rf $DIR/$tdir || error "rmdir failed" @@ -2458,11 +2935,13 @@ test_81d() { rmdir $remote_dir & local CLIENT_PID=$! + replay_barrier mds1 + replay_barrier mds2 fail mds${MDTIDX},mds$((MDTIDX + 1)) wait $CLIENT_PID || error "rm remote dir failed" - stat $remote_dir 2&>/dev/null && error "$remote_dir still exist!" + stat $remote_dir &>/dev/null && error "$remote_dir still exist!" rm -rf $DIR/$tdir || error "rmdir failed" @@ -2489,11 +2968,12 @@ test_81e() { local CLIENT_PID=$! do_facet mds$((MDTIDX + 1)) lctl set_param fail_loc=0 + replay_barrier mds1 fail mds${MDTIDX} wait $CLIENT_PID || error "rm remote dir failed" - stat $remote_dir 2&>/dev/null && error "$remote_dir still exist!" + stat $remote_dir &>/dev/null && error "$remote_dir still exist!" rm -rf $DIR/$tdir || error "rmdir failed" @@ -2519,11 +2999,12 @@ test_81f() { rmdir $remote_dir & local CLIENT_PID=$! + replay_barrier mds2 fail mds$((MDTIDX + 1)) wait $CLIENT_PID || error "rm remote dir failed" - stat $remote_dir 2&>/dev/null && error "$remote_dir still exist!" + stat $remote_dir &>/dev/null && error "$remote_dir still exist!" rm -rf $DIR/$tdir || error "rmdir failed" @@ -2549,12 +3030,14 @@ test_81g() { rmdir $remote_dir & local CLIENT_PID=$! + replay_barrier mds1 + replay_barrier mds2 fail mds${MDTIDX} fail mds$((MDTIDX + 1)) wait $CLIENT_PID || error "rm remote dir failed" - stat $remote_dir 2&>/dev/null && error "$remote_dir still exist!" + stat $remote_dir &>/dev/null && error "$remote_dir still exist!" rm -rf $DIR/$tdir || error "rmdir failed" @@ -2575,11 +3058,13 @@ test_81h() { rmdir $remote_dir & local CLIENT_PID=$! + replay_barrier mds1 + replay_barrier mds2 fail mds${MDTIDX},mds$((MDTIDX + 1)) wait $CLIENT_PID || error "rm remote dir failed" - stat $remote_dir 2&>/dev/null && error "$remote_dir still exist!" + stat $remote_dir &>/dev/null && error "$remote_dir still exist!" rm -rf $DIR/$tdir || error "rmdir failed" @@ -2607,7 +3092,7 @@ test_85a() { #bug 16774 done lov_id=$(lctl dl | grep "clilov") - addr=$(echo $lov_id | awk '{print $4}' | awk -F '-' '{print $3}') + addr=$(echo $lov_id | awk '{print $4}' | awk -F '-' '{print $NF}') count=$(lctl get_param -n \ ldlm.namespaces.*MDT0000*$addr.lock_unused_count) echo "before recovery: unused locks count = $count" @@ -2627,7 +3112,11 @@ run_test 85a "check the cancellation of unused locks during recovery(IBITS)" test_85b() { #bug 16774 lctl set_param -n ldlm.cancel_unused_locks_before_replay "1" - do_facet mgs $LCTL pool_new $FSNAME.$TESTNAME || + if ! combined_mgs_mds ; then + mount_mgs_client + fi + + create_pool $FSNAME.$TESTNAME || error "unable to create pool $TESTNAME" do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $FSNAME-OST0000 || error "unable to add pool $TESTNAME" @@ -2647,11 +3136,11 @@ test_85b() { #bug 16774 done lov_id=$(lctl dl | grep "clilov") - addr=$(echo $lov_id | awk '{print $4}' | awk -F '-' '{print $3}') - count=$(lctl get_param \ - -n ldlm.namespaces.*OST0000*$addr.lock_unused_count) + addr=$(echo $lov_id | awk '{print $4}' | awk -F '-' '{print $NF}') + count=$(lctl get_param -n \ + ldlm.namespaces.*OST0000*$addr.lock_unused_count) echo "before recovery: unused locks count = $count" - [ $count != 0 ] || error "unused locks ($count) should be zero" + [ $count -ne 0 ] || error "unused locks ($count) should be zero" fail ost1 @@ -2664,6 +3153,10 @@ test_85b() { #bug 16774 do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME || error "unable to destroy the pool $TESTNAME" + if ! combined_mgs_mds ; then + umount_mgs_client + fi + if [ $count2 -ge $count ]; then error "unused locks are not canceled" fi @@ -2680,7 +3173,7 @@ test_86() { } run_test 86 "umount server after clear nid_stats should not hit LBUG" -test_87() { +test_87a() { do_facet ost1 "lctl set_param -n obdfilter.${ost1_svc}.sync_journal 0" replay_barrier ost1 @@ -2696,7 +3189,7 @@ test_87() { error "New checksum $cksum2 does not match original $cksum" fi } -run_test 87 "write replay" +run_test 87a "write replay" test_87b() { do_facet ost1 "lctl set_param -n obdfilter.${ost1_svc}.sync_journal 0" @@ -2804,11 +3297,14 @@ test_89() { cancel_lru_locks osc mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed" rm -f $DIR/$tdir/$tfile - wait_mds_ost_sync - wait_delete_completed - BLOCKS1=$(df -P $MOUNT | tail -n 1 | awk '{ print $3 }') + wait_mds_ost_sync || error "initial MDS-OST sync timed out" + wait_delete_completed || error "initial wait delete timed out" + local blocks1=$(df -P $MOUNT | tail -n 1 | awk '{ print $3 }') + local write_size=$(fs_log_size) + $SETSTRIPE -i 0 -c 1 $DIR/$tdir/$tfile - dd if=/dev/zero bs=1M count=10 of=$DIR/$tdir/$tfile + [ $write_size -lt 1024 ] && write_size=1024 + dd if=/dev/zero bs=${write_size}k count=10 of=$DIR/$tdir/$tfile sync stop ost1 facet_failover $SINGLEMDS @@ -2817,23 +3313,24 @@ test_89() { mount_facet ost1 zconf_mount $(hostname) $MOUNT || error "mount fails" client_up || error "client_up failed" - wait_mds_ost_sync - wait_delete_completed - BLOCKS2=$(df -P $MOUNT | tail -n 1 | awk '{ print $3 }') - [ $((BLOCKS2 - BLOCKS1)) -le 4 ] || - error $((BLOCKS2 - BLOCKS1)) blocks leaked -} + wait_mds_ost_sync || error "MDS-OST sync timed out" + wait_delete_completed || error "wait delete timed out" + local blocks2=$(df -P $MOUNT | tail -n 1 | awk '{ print $3 }') + [ $((blocks2 - blocks1)) -le $(fs_log_size) ] || + error $((blocks2 - blocks1)) blocks leaked +} run_test 89 "no disk space leak on late ost connection" cleanup_90 () { - local facet=$1 - trap 0 - reboot_facet $facet - change_active $facet - wait_for_facet $facet - mount_facet $facet || error "Restart of $facet failed" - clients_up + local facet=$1 + + trap 0 + reboot_facet $facet + change_active $facet + wait_for_facet $facet + mount_facet $facet || error "Restart of $facet failed" + clients_up } test_90() { # bug 19494 @@ -2847,6 +3344,8 @@ test_90() { # bug 19494 return 0 fi fi + # ensure all OSTs are active to allow allocations + wait_osts_up mkdir $dir || error "mkdir $dir failed" @@ -2918,7 +3417,7 @@ test_90() { # bug 19494 } run_test 90 "lfs find identifies the missing striped file segments" -test_93() { +test_93a() { local server_version=$(lustre_version_code $SINGLEMDS) [[ $server_version -ge $(version_code 2.6.90) ]] || [[ $server_version -ge $(version_code 2.5.4) && @@ -2940,7 +3439,28 @@ test_93() { do_facet ost1 "$LCTL set_param fail_loc=0x715" fail ost1 } -run_test 93 "replay + reconnect" +run_test 93a "replay + reconnect" + +test_93b() { + local server_version=$(lustre_version_code $SINGLEMDS) + [[ $server_version -ge $(version_code 2.7.90) ]] || + { skip "Need MDS version 2.7.90+"; return; } + + cancel_lru_locks mdc + + createmany -o $DIR/$tfile 20 || + error "createmany -o $DIR/$tfile failed" + + #define OBD_FAIL_TGT_REPLAY_RECONNECT 0x715 + # We need to emulate a state that MDT is waiting for other clients + # not completing the recovery. Final ping is queued, but reply will be + # sent on the recovery completion. It is done by sleep before + # processing final pings + do_facet mds1 "$LCTL set_param fail_val=80" + do_facet mds1 "$LCTL set_param fail_loc=0x715" + fail mds1 +} +run_test 93b "replay + reconnect on mds" striped_dir_check_100() { local striped_dir=$DIR/$tdir/striped_dir @@ -3035,6 +3555,1136 @@ test_101() { #LU-5648 } run_test 101 "Shouldn't reassign precreated objs to other files after recovery" +test_102a() { + local idx + local facet + local num + local i + local pids pid + + [[ $(lctl get_param mdc.*.import | + grep "connect_flags:.*multi_mod_rpc") ]] || + { skip "Need MDC with 'multi_mod_rpcs' feature"; return 0; } + + $LFS mkdir -c1 $DIR/$tdir || error "mkdir $DIR/$tdir failed" + idx=$(printf "%04x" $($LFS getdirstripe -i $DIR/$tdir)) + facet="mds$((0x$idx + 1))" + + # get current value of max_mod_rcps_in_flight + num=$($LCTL get_param -n \ + mdc.$FSNAME-MDT$idx-mdc-*.max_mod_rpcs_in_flight) + # set default value if client does not support multi mod RPCs + [ -z "$num" ] && num=1 + + echo "creating $num files ..." + umask 0022 + for i in $(seq $num); do + touch $DIR/$tdir/file-$i + done + + # drop request on MDT to force resend + #define OBD_FAIL_MDS_REINT_MULTI_NET 0x159 + do_facet $facet "$LCTL set_param fail_loc=0x159" + echo "launch $num chmod in parallel ($(date +%H:%M:%S)) ..." + for i in $(seq $num); do + chmod 0600 $DIR/$tdir/file-$i & + pids="$pids $!" + done + sleep 1 + do_facet $facet "$LCTL set_param fail_loc=0" + for pid in $pids; do + wait $pid || error "chmod failed" + done + echo "done ($(date +%H:%M:%S))" + + # check chmod succeed + for i in $(seq $num); do + checkstat -vp 0600 $DIR/$tdir/file-$i + done + + rm -rf $DIR/$tdir +} +run_test 102a "check resend (request lost) with multiple modify RPCs in flight" + +test_102b() { + local idx + local facet + local num + local i + local pids pid + + [[ $(lctl get_param mdc.*.import | + grep "connect_flags:.*multi_mod_rpc") ]] || + { skip "Need MDC with 'multi_mod_rpcs' feature"; return 0; } + + $LFS mkdir -c1 $DIR/$tdir || error "mkdir $DIR/$tdir failed" + idx=$(printf "%04x" $($LFS getdirstripe -i $DIR/$tdir)) + facet="mds$((0x$idx + 1))" + + # get current value of max_mod_rcps_in_flight + num=$($LCTL get_param -n \ + mdc.$FSNAME-MDT$idx-mdc-*.max_mod_rpcs_in_flight) + # set default value if client does not support multi mod RPCs + [ -z "$num" ] && num=1 + + echo "creating $num files ..." + umask 0022 + for i in $(seq $num); do + touch $DIR/$tdir/file-$i + done + + # drop reply on MDT to force reconstruction + #define OBD_FAIL_MDS_REINT_MULTI_NET_REP 0x15a + do_facet $facet "$LCTL set_param fail_loc=0x15a" + echo "launch $num chmod in parallel ($(date +%H:%M:%S)) ..." + for i in $(seq $num); do + chmod 0600 $DIR/$tdir/file-$i & + pids="$pids $!" + done + sleep 1 + do_facet $facet "$LCTL set_param fail_loc=0" + for pid in $pids; do + wait $pid || error "chmod failed" + done + echo "done ($(date +%H:%M:%S))" + + # check chmod succeed + for i in $(seq $num); do + checkstat -vp 0600 $DIR/$tdir/file-$i + done + + rm -rf $DIR/$tdir +} +run_test 102b "check resend (reply lost) with multiple modify RPCs in flight" + +test_102c() { + local idx + local facet + local num + local i + local pids pid + + [[ $(lctl get_param mdc.*.import | + grep "connect_flags:.*multi_mod_rpc") ]] || + { skip "Need MDC with 'multi_mod_rpcs' feature"; return 0; } + + $LFS mkdir -c1 $DIR/$tdir || error "mkdir $DIR/$tdir failed" + idx=$(printf "%04x" $($LFS getdirstripe -i $DIR/$tdir)) + facet="mds$((0x$idx + 1))" + + # get current value of max_mod_rcps_in_flight + num=$($LCTL get_param -n \ + mdc.$FSNAME-MDT$idx-mdc-*.max_mod_rpcs_in_flight) + # set default value if client does not support multi mod RPCs + [ -z "$num" ] && num=1 + + echo "creating $num files ..." + umask 0022 + for i in $(seq $num); do + touch $DIR/$tdir/file-$i + done + + replay_barrier $facet + + # drop reply on MDT + #define OBD_FAIL_MDS_REINT_MULTI_NET_REP 0x15a + do_facet $facet "$LCTL set_param fail_loc=0x15a" + echo "launch $num chmod in parallel ($(date +%H:%M:%S)) ..." + for i in $(seq $num); do + chmod 0600 $DIR/$tdir/file-$i & + pids="$pids $!" + done + sleep 1 + do_facet $facet "$LCTL set_param fail_loc=0" + + # fail MDT + fail $facet + + for pid in $pids; do + wait $pid || error "chmod failed" + done + echo "done ($(date +%H:%M:%S))" + + # check chmod succeed + for i in $(seq $num); do + checkstat -vp 0600 $DIR/$tdir/file-$i + done + + rm -rf $DIR/$tdir +} +run_test 102c "check replay w/o reconstruction with multiple mod RPCs in flight" + +test_102d() { + local idx + local facet + local num + local i + local pids pid + + [[ $(lctl get_param mdc.*.import | + grep "connect_flags:.*multi_mod_rpc") ]] || + { skip "Need MDC with 'multi_mod_rpcs' feature"; return 0; } + + $LFS mkdir -c1 $DIR/$tdir || error "mkdir $DIR/$tdir failed" + idx=$(printf "%04x" $($LFS getdirstripe -i $DIR/$tdir)) + facet="mds$((0x$idx + 1))" + + # get current value of max_mod_rcps_in_flight + num=$($LCTL get_param -n \ + mdc.$FSNAME-MDT$idx-mdc-*.max_mod_rpcs_in_flight) + # set default value if client does not support multi mod RPCs + [ -z "$num" ] && num=1 + + echo "creating $num files ..." + umask 0022 + for i in $(seq $num); do + touch $DIR/$tdir/file-$i + done + + # drop reply on MDT + #define OBD_FAIL_MDS_REINT_MULTI_NET_REP 0x15a + do_facet $facet "$LCTL set_param fail_loc=0x15a" + echo "launch $num chmod in parallel ($(date +%H:%M:%S)) ..." + for i in $(seq $num); do + chmod 0600 $DIR/$tdir/file-$i & + pids="$pids $!" + done + sleep 1 + + # write MDT transactions to disk + do_facet $facet "sync; sync; sync" + + do_facet $facet "$LCTL set_param fail_loc=0" + + # fail MDT + fail $facet + + for pid in $pids; do + wait $pid || error "chmod failed" + done + echo "done ($(date +%H:%M:%S))" + + # check chmod succeed + for i in $(seq $num); do + checkstat -vp 0600 $DIR/$tdir/file-$i + done + + rm -rf $DIR/$tdir +} +run_test 102d "check replay & reconstruction with multiple mod RPCs in flight" + +test_103() { + remote_mds_nodsh && skip "remote MDS with nodsh" && return + local mds_version=$(lustre_version_code $SINGLEMDS) + [[ $mds_version -gt $(version_code 2.8.54) ]] || + { skip "Need MDS version 2.8.54+"; return; } + +#define OBD_FAIL_MDS_TRACK_OVERFLOW 0x162 + do_facet mds1 $LCTL set_param fail_loc=0x80000162 + + mkdir -p $DIR/$tdir + createmany -o $DIR/$tdir/t- 30 || + error "create files on remote directory failed" + sync + rm -rf $DIR/$tdir/t-* + sync +#MDS should crash with tr->otr_next_id overflow + fail mds1 +} +run_test 103 "Check otr_next_id overflow" + + +check_striped_dir_110() +{ + $CHECKSTAT -t dir $DIR/$tdir/striped_dir || + error "create striped dir failed" + local stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir) + [ $stripe_count -eq $MDSCOUNT ] || + error "$stripe_count != 2 after recovery" +} + +test_110a() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + mkdir -p $DIR/$tdir + replay_barrier mds1 + $LFS mkdir -i1 -c$MDSCOUNT $DIR/$tdir/striped_dir + fail mds1 + + check_striped_dir_110 || error "check striped_dir failed" + rm -rf $DIR/$tdir || error "rmdir failed" + + return 0 +} +run_test 110a "DNE: create striped dir, fail MDT1" + +test_110b() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + mkdir -p $DIR/$tdir + replay_barrier mds1 + $LFS mkdir -i1 -c$MDSCOUNT $DIR/$tdir/striped_dir + umount $MOUNT + fail mds1 + zconf_mount $(hostname) $MOUNT + client_up || return 1 + + check_striped_dir_110 || error "check striped_dir failed" + + rm -rf $DIR/$tdir || error "rmdir failed" + + return 0 +} +run_test 110b "DNE: create striped dir, fail MDT1 and client" + +test_110c() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + mkdir -p $DIR/$tdir + replay_barrier mds2 + $LFS mkdir -i1 -c$MDSCOUNT $DIR/$tdir/striped_dir + fail mds2 + + check_striped_dir_110 || error "check striped_dir failed" + + rm -rf $DIR/$tdir || error "rmdir failed" + + return 0 +} +run_test 110c "DNE: create striped dir, fail MDT2" + +test_110d() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + mkdir -p $DIR/$tdir + replay_barrier mds2 + $LFS mkdir -i1 -c$MDSCOUNT $DIR/$tdir/striped_dir + umount $MOUNT + fail mds2 + zconf_mount $(hostname) $MOUNT + client_up || return 1 + + check_striped_dir_110 || error "check striped_dir failed" + + rm -rf $DIR/$tdir || error "rmdir failed" + + return 0 +} +run_test 110d "DNE: create striped dir, fail MDT2 and client" + +test_110e() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + mkdir -p $DIR/$tdir + replay_barrier mds2 + $LFS mkdir -i1 -c$MDSCOUNT $DIR/$tdir/striped_dir + umount $MOUNT + replay_barrier mds1 + fail mds1,mds2 + zconf_mount $(hostname) $MOUNT + client_up || return 1 + + check_striped_dir_110 || error "check striped_dir failed" + + rm -rf $DIR/$tdir || error "rmdir failed" + + return 0 +} +run_test 110e "DNE: create striped dir, uncommit on MDT2, fail client/MDT1/MDT2" + +test_110f() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + mkdir -p $DIR/$tdir + replay_barrier mds1 + replay_barrier mds2 + $LFS mkdir -i1 -c$MDSCOUNT $DIR/$tdir/striped_dir + fail mds2,mds1 + + check_striped_dir_110 || error "check striped_dir failed" + + rm -rf $DIR/$tdir || error "rmdir failed" + + return 0 +} +run_test 110f "DNE: create striped dir, fail MDT1/MDT2" + +test_110g() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + mkdir -p $DIR/$tdir + replay_barrier mds1 + $LFS mkdir -i1 -c$MDSCOUNT $DIR/$tdir/striped_dir + umount $MOUNT + replay_barrier mds2 + fail mds1,mds2 + zconf_mount $(hostname) $MOUNT + client_up || return 1 + + check_striped_dir_110 || error "check striped_dir failed" + + rm -rf $DIR/$tdir || error "rmdir failed" + + return 0 +} +run_test 110g "DNE: create striped dir, uncommit on MDT1, fail client/MDT1/MDT2" + +test_111a() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + mkdir -p $DIR/$tdir + $LFS mkdir -i1 -c2 $DIR/$tdir/striped_dir + replay_barrier mds1 + rm -rf $DIR/$tdir/striped_dir + fail mds1 + + $CHECKSTAT -t dir $DIR/$tdir/striped_dir && + error "striped dir still exists" + return 0 +} +run_test 111a "DNE: unlink striped dir, fail MDT1" + +test_111b() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + mkdir -p $DIR/$tdir + $LFS mkdir -i1 -c2 $DIR/$tdir/striped_dir + replay_barrier mds2 + rm -rf $DIR/$tdir/striped_dir + umount $MOUNT + fail mds2 + zconf_mount $(hostname) $MOUNT + client_up || return 1 + + $CHECKSTAT -t dir $DIR/$tdir/striped_dir && + error "striped dir still exists" + return 0 +} +run_test 111b "DNE: unlink striped dir, fail MDT2" + +test_111c() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + mkdir -p $DIR/$tdir + $LFS mkdir -i1 -c2 $DIR/$tdir/striped_dir + replay_barrier mds1 + rm -rf $DIR/$tdir/striped_dir + umount $MOUNT + replay_barrier mds2 + fail mds1,mds2 + zconf_mount $(hostname) $MOUNT + client_up || return 1 + $CHECKSTAT -t dir $DIR/$tdir/striped_dir && + error "striped dir still exists" + return 0 +} +run_test 111c "DNE: unlink striped dir, uncommit on MDT1, fail client/MDT1/MDT2" + +test_111d() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + mkdir -p $DIR/$tdir + $LFS mkdir -i1 -c2 $DIR/$tdir/striped_dir + replay_barrier mds2 + rm -rf $DIR/$tdir/striped_dir + umount $MOUNT + replay_barrier mds1 + fail mds1,mds2 + zconf_mount $(hostname) $MOUNT + client_up || return 1 + $CHECKSTAT -t dir $DIR/$tdir/striped_dir && + error "striped dir still exists" + + return 0 +} +run_test 111d "DNE: unlink striped dir, uncommit on MDT2, fail client/MDT1/MDT2" + +test_111e() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + mkdir -p $DIR/$tdir + $LFS mkdir -i1 -c2 $DIR/$tdir/striped_dir + replay_barrier mds2 + rm -rf $DIR/$tdir/striped_dir + replay_barrier mds1 + fail mds1,mds2 + $CHECKSTAT -t dir $DIR/$tdir/striped_dir && + error "striped dir still exists" + return 0 +} +run_test 111e "DNE: unlink striped dir, uncommit on MDT2, fail MDT1/MDT2" + +test_111f() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + mkdir -p $DIR/$tdir + $LFS mkdir -i1 -c2 $DIR/$tdir/striped_dir + replay_barrier mds1 + rm -rf $DIR/$tdir/striped_dir + replay_barrier mds2 + fail mds1,mds2 + $CHECKSTAT -t dir $DIR/$tdir/striped_dir && + error "striped dir still exists" + return 0 +} +run_test 111f "DNE: unlink striped dir, uncommit on MDT1, fail MDT1/MDT2" + +test_111g() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + mkdir -p $DIR/$tdir + $LFS mkdir -i1 -c2 $DIR/$tdir/striped_dir + replay_barrier mds1 + replay_barrier mds2 + rm -rf $DIR/$tdir/striped_dir + fail mds1,mds2 + $CHECKSTAT -t dir $DIR/$tdir/striped_dir && + error "striped dir still exists" + return 0 +} +run_test 111g "DNE: unlink striped dir, fail MDT1/MDT2" + +test_112_rename_prepare() { + mkdir -p $DIR/$tdir/src_dir + $LFS mkdir -i 1 $DIR/$tdir/src_dir/src_child || + error "create remote source failed" + + touch $DIR/$tdir/src_dir/src_child/a + + $LFS mkdir -i 2 $DIR/$tdir/tgt_dir || + error "create remote target dir failed" + + $LFS mkdir -i 3 $DIR/$tdir/tgt_dir/tgt_child || + error "create remote target child failed" +} + +test_112_check() { + find $DIR/$tdir/ + $CHECKSTAT -t dir $DIR/$tdir/src_dir/src_child && + error "src_child still exists after rename" + + $CHECKSTAT -t file $DIR/$tdir/tgt_dir/tgt_child/a || + error "missing file(a) after rename" +} + +test_112a() { + [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + test_112_rename_prepare + replay_barrier mds1 + + mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child || + error "rename dir cross MDT failed!" + fail mds1 + + test_112_check + rm -rf $DIR/$tdir || error "rmdir failed" +} +run_test 112a "DNE: cross MDT rename, fail MDT1" + +test_112b() { + [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + test_112_rename_prepare + replay_barrier mds2 + + mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child || + error "rename dir cross MDT failed!" + + fail mds2 + + test_112_check + rm -rf $DIR/$tdir || error "rmdir failed" +} +run_test 112b "DNE: cross MDT rename, fail MDT2" + +test_112c() { + [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + test_112_rename_prepare + replay_barrier mds3 + + mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child || + error "rename dir cross MDT failed!" + + fail mds3 + + test_112_check + rm -rf $DIR/$tdir || error "rmdir failed" +} +run_test 112c "DNE: cross MDT rename, fail MDT3" + +test_112d() { + [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + test_112_rename_prepare + replay_barrier mds4 + + mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child || + error "rename dir cross MDT failed!" + + fail mds4 + + test_112_check + rm -rf $DIR/$tdir || error "rmdir failed" +} +run_test 112d "DNE: cross MDT rename, fail MDT4" + +test_112e() { + [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + test_112_rename_prepare + replay_barrier mds1 + replay_barrier mds2 + + mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child || + error "rename dir cross MDT failed!" + + fail mds1,mds2 + + test_112_check + rm -rf $DIR/$tdir || error "rmdir failed" +} +run_test 112e "DNE: cross MDT rename, fail MDT1 and MDT2" + +test_112f() { + [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + test_112_rename_prepare + replay_barrier mds1 + replay_barrier mds3 + + mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child || + error "rename dir cross MDT failed!" + + fail mds1,mds3 + + test_112_check + rm -rf $DIR/$tdir || error "rmdir failed" +} +run_test 112f "DNE: cross MDT rename, fail MDT1 and MDT3" + +test_112g() { + [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + test_112_rename_prepare + replay_barrier mds1 + replay_barrier mds4 + + mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child || + error "rename dir cross MDT failed!" + + fail mds1,mds4 + + test_112_check + rm -rf $DIR/$tdir || error "rmdir failed" +} +run_test 112g "DNE: cross MDT rename, fail MDT1 and MDT4" + +test_112h() { + [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + test_112_rename_prepare + replay_barrier mds2 + replay_barrier mds3 + + mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child || + error "rename dir cross MDT failed!" + + fail mds2,mds3 + + test_112_check + rm -rf $DIR/$tdir || error "rmdir failed" +} +run_test 112h "DNE: cross MDT rename, fail MDT2 and MDT3" + +test_112i() { + [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + test_112_rename_prepare + replay_barrier mds2 + replay_barrier mds4 + + mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child || + error "rename dir cross MDT failed!" + + fail mds2,mds4 + + test_112_check + rm -rf $DIR/$tdir || error "rmdir failed" +} +run_test 112i "DNE: cross MDT rename, fail MDT2 and MDT4" + +test_112j() { + [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + test_112_rename_prepare + replay_barrier mds3 + replay_barrier mds4 + + mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child || + error "rename dir cross MDT failed!" + + fail mds3,mds4 + + test_112_check + rm -rf $DIR/$tdir || error "rmdir failed" +} +run_test 112j "DNE: cross MDT rename, fail MDT3 and MDT4" + +test_112k() { + [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + test_112_rename_prepare + replay_barrier mds1 + replay_barrier mds2 + replay_barrier mds3 + + mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child || + error "rename dir cross MDT failed!" + + fail mds1,mds2,mds3 + + test_112_check + rm -rf $DIR/$tdir || error "rmdir failed" +} +run_test 112k "DNE: cross MDT rename, fail MDT1,MDT2,MDT3" + +test_112l() { + [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + test_112_rename_prepare + replay_barrier mds1 + replay_barrier mds2 + replay_barrier mds4 + + mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child || + error "rename dir cross MDT failed!" + + fail mds1,mds2,mds4 + + test_112_check + rm -rf $DIR/$tdir || error "rmdir failed" +} +run_test 112l "DNE: cross MDT rename, fail MDT1,MDT2,MDT4" + +test_112m() { + [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + test_112_rename_prepare + replay_barrier mds1 + replay_barrier mds3 + replay_barrier mds4 + + mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child || + error "rename dir cross MDT failed!" + + fail mds1,mds3,mds4 + + test_112_check + rm -rf $DIR/$tdir || error "rmdir failed" +} +run_test 112m "DNE: cross MDT rename, fail MDT1,MDT3,MDT4" + +test_112n() { + [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + + test_112_rename_prepare + replay_barrier mds2 + replay_barrier mds3 + replay_barrier mds4 + + mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child || + error "rename dir cross MDT failed!" + + fail mds2,mds3,mds4 + + test_112_check + rm -rf $DIR/$tdir || error "rmdir failed" +} +run_test 112n "DNE: cross MDT rename, fail MDT2,MDT3,MDT4" + +test_115() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + local fail_index=0 + local index + local i + local j + + mkdir -p $DIR/$tdir + for ((j=0;j<$((MDSCOUNT));j++)); do + fail_index=$((fail_index+1)) + index=$((fail_index % MDSCOUNT)) + replay_barrier mds$((index + 1)) + for ((i=0;i<5;i++)); do + test_mkdir -i$index -c$MDSCOUNT $DIR/$tdir/test_$i || + error "create striped dir $DIR/$tdir/test_$i" + done + + fail mds$((index + 1)) + for ((i=0;i<5;i++)); do + checkstat -t dir $DIR/$tdir/test_$i || + error "$DIR/$tdir/test_$i does not exist!" + done + rm -rf $DIR/$tdir/test_* || + error "rmdir fails" + done +} +run_test 115 "failover for create/unlink striped directory" + +test_116a() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] && + skip "Do not support large update log before 2.7.55" && + return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + local fail_index=0 + + mkdir -p $DIR/$tdir + replay_barrier mds1 + + # OBD_FAIL_SPLIT_UPDATE_REC 0x1702 + do_facet mds1 "lctl set_param fail_loc=0x80001702" + $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir + + fail mds1 + $CHECKSTAT -t dir $DIR/$tdir/striped_dir || + error "stried_dir does not exists" +} +run_test 116a "large update log master MDT recovery" + +test_116b() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] && + skip "Do not support large update log before 2.7.55" && + return 0 + + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + local fail_index=0 + + mkdir -p $DIR/$tdir + replay_barrier mds2 + + # OBD_FAIL_SPLIT_UPDATE_REC 0x1702 + do_facet mds2 "lctl set_param fail_loc=0x80001702" + $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir + + fail mds2 + $CHECKSTAT -t dir $DIR/$tdir/striped_dir || + error "stried_dir does not exists" +} +run_test 116b "large update log slave MDT recovery" + +test_117() { + [ $MDSCOUNT -lt 4 ] && skip "needs >= 4 MDTs" && return 0 + ([ $FAILURE_MODE == "HARD" ] && + [ "$(facet_host mds1)" == "$(facet_host mds2)" ]) && + skip "MDTs needs to be on diff hosts for HARD fail mode" && + return 0 + local index + local mds_indexs + + mkdir -p $DIR/$tdir + $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/remote_dir + $LFS setdirstripe -i1 -c$MDSCOUNT $DIR/$tdir/remote_dir_1 + sleep 2 + + # Let's set rdonly on all MDTs, so client will send + # replay requests on all MDTs and replay these requests + # at the same time. This test will verify the recovery + # will not be deadlock in this case, LU-7531. + for ((index = 0; index < $((MDSCOUNT)); index++)); do + replay_barrier mds$((index + 1)) + if [ -z $mds_indexs ]; then + mds_indexs="${mds_indexs}mds$((index+1))" + else + mds_indexs="${mds_indexs},mds$((index+1))" + fi + done + + rm -rf $DIR/$tdir/remote_dir + rm -rf $DIR/$tdir/remote_dir_1 + + fail $mds_indexs + + rm -rf $DIR/$tdir || error "rmdir failed" +} +run_test 117 "DNE: cross MDT unlink, fail MDT1 and MDT2" + +test_118() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.64) ] && + skip "Do not support large update log before 2.7.64" && + return 0 + + mkdir -p $DIR/$tdir + + $LFS setdirstripe -c2 $DIR/$tdir/striped_dir || + error "setdirstripe fails" + $LFS setdirstripe -c2 $DIR/$tdir/striped_dir1 || + error "setdirstripe fails 1" + rm -rf $DIR/$tdir/striped_dir* || error "rmdir fails" + + # OBD_FAIL_INVALIDATE_UPDATE 0x1705 + do_facet mds1 "lctl set_param fail_loc=0x1705" + $LFS setdirstripe -c2 $DIR/$tdir/striped_dir + $LFS setdirstripe -c2 $DIR/$tdir/striped_dir1 + do_facet mds1 "lctl set_param fail_loc=0x0" + + replay_barrier mds1 + $LFS setdirstripe -c2 $DIR/$tdir/striped_dir + $LFS setdirstripe -c2 $DIR/$tdir/striped_dir1 + fail mds1 + + true +} +run_test 118 "invalidate osp update will not cause update log corruption" + +test_119() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.64) ] && + skip "Do not support large update log before 2.7.64" && + return 0 + local stripe_count + local hard_timeout=$(do_facet mds1 \ + "lctl get_param -n mdt.$FSNAME-MDT0000.recovery_time_hard") + + local clients=${CLIENTS:-$HOSTNAME} + local time_min=$(recovery_time_min) + + mkdir -p $DIR/$tdir + mkdir $DIR/$tdir/tmp + rmdir $DIR/$tdir/tmp + + replay_barrier mds1 + mkdir $DIR/$tdir/dir_1 + for ((i = 0; i < 20; i++)); do + $LFS setdirstripe -i0 -c2 $DIR/$tdir/stripe_dir-$i + done + + stop mds1 + change_active mds1 + wait_for_facet mds1 + + #define OBD_FAIL_TGT_REPLAY_DELAY 0x714 + do_facet mds1 $LCTL set_param fail_loc=0x80000714 + #sleep (timeout + 5), so mds will evict the client exports, + #but DNE update recovery will keep going. + do_facet mds1 $LCTL set_param fail_val=$((time_min + 5)) + + mount_facet mds1 "-o recovery_time_hard=$time_min" + + wait_clients_import_state "$clients" mds1 FULL + + clients_up || clients_up || error "failover df: $?" + + #revert back the hard timeout + do_facet mds1 $LCTL set_param \ + mdt.$FSNAME-MDT0000.recovery_time_hard=$hard_timeout + + for ((i = 0; i < 20; i++)); do + stripe_count=$($LFS getdirstripe -c $DIR/$tdir/stripe_dir-$i) + [ $stripe_count == 2 ] || { + error "stripe_dir-$i creation replay fails" + break + } + done +} +run_test 119 "timeout of normal replay does not cause DNE replay fails " + +test_120() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.64) ] && + skip "Do not support large update log before 2.7.64" && + return 0 + + mkdir $DIR/$tdir + replay_barrier_nosync mds1 + for ((i = 0; i < 20; i++)); do + mkdir $DIR/$tdir/dir-$i || { + error "create dir-$i fails" + break + } + $LFS setdirstripe -i0 -c2 $DIR/$tdir/stripe_dir-$i || { + error "create stripe_dir-$i fails" + break + } + done + + fail_abort mds1 + + for ((i = 0; i < 20; i++)); do + [ ! -e "$DIR/$tdir/dir-$i" ] || { + error "dir-$i still exists" + break + } + [ ! -e "$DIR/$tdir/stripe_dir-$i" ] || { + error "stripe_dir-$i still exists" + break + } + done +} +run_test 120 "DNE fail abort should stop both normal and DNE replay" + +test_121() { + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.90) ] && + skip "Don't support it before 2.11" && + return 0 + + local at_max_saved=$(at_max_get mds) + + touch $DIR/$tfile || error "touch $DIR/$tfile failed" + cancel_lru_locks mdc + + multiop_bg_pause $DIR/$tfile s_s || error "multiop $DIR/$tfile failed" + mpid=$! + + lctl set_param -n ldlm.cancel_unused_locks_before_replay "0" + + stop mds1 + change_active mds1 + wait_for_facet mds1 + + #define OBD_FAIL_TGT_RECOVERY_REQ_RACE 0x721 + do_facet $SINGLEMDS "lctl set_param fail_loc=0x721 fail_val=0" + at_max_set 0 mds + + mount_facet mds1 + wait_clients_import_state "$clients" mds1 FULL + clients_up || clients_up || error "failover df: $?" + + kill -USR1 $mpid + wait $mpid || error "multiop_bg_pause pid failed" + + do_facet $SINGLEMDS "lctl set_param fail_loc=0x0" + lctl set_param -n ldlm.cancel_unused_locks_before_replay "1" + at_max_set $at_max_saved mds + rm -f $DIR/$tfile +} +run_test 121 "lock replay timed out and race" + complete $SECONDS check_and_cleanup_lustre exit_status