X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Freplay-single.sh;h=1124d693201ee9e88082acb2d0c16fc3eebde2b6;hp=1d385f85ca98b98dbf991b5cded75779d0631a09;hb=d968245894506f9620dfc652e9f8fdec0476cff6;hpb=113303973ec9f8484eb2355a1a6ef3c4c7fd6a56 diff --git a/lustre/tests/replay-single.sh b/lustre/tests/replay-single.sh index 1d385f8..1124d69 100755 --- a/lustre/tests/replay-single.sh +++ b/lustre/tests/replay-single.sh @@ -6,58 +6,33 @@ set -e # # This test needs to be run on the client # - +SAVE_PWD=$PWD LUSTRE=${LUSTRE:-`dirname $0`/..} +SETUP=${SETUP:-} +CLEANUP=${CLEANUP:-} . $LUSTRE/tests/test-framework.sh init_test_env $@ . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh} +CHECK_GRANT=${CHECK_GRANT:-"yes"} +GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""} # Skip these tests -# bug number: 4176 -ALWAYS_EXCEPT="39 $REPLAY_SINGLE_EXCEPT" - -gen_config() { - rm -f $XMLCONFIG - add_mds mds --dev $MDSDEV --size $MDSSIZE - if [ ! -z "$mdsfailover_HOST" ]; then - add_mdsfailover mds --dev $MDSDEV --size $MDSSIZE - fi - - add_lov lov1 mds --stripe_sz $STRIPE_BYTES \ - --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0 - add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE - add_ost ost2 --lov lov1 --dev ${OSTDEV}-2 --size $OSTSIZE - add_client client mds --lov lov1 --path $MOUNT -} +# bug number: 2766 4176 +ALWAYS_EXCEPT="0b 39 $REPLAY_SINGLE_EXCEPT" build_test_filter -SETUP=${SETUP:-"setup"} -CLEANUP=${CLEANUP:-"cleanupall"} - -if [ "$ONLY" == "cleanup" ]; then - sysctl -w lnet.debug=0 || true - $CLEANUP - exit 0 -fi - -setup() { - formatall - setupall -} - -$SETUP - -if [ "$ONLY" == "setup" ]; then - exit 0 -fi +cleanup_and_setup_lustre mkdir -p $DIR test_0() { - replay_barrier mds - fail mds + sleep 10 + mkdir $DIR/$tfile + replay_barrier $SINGLEMDS + fail $SINGLEMDS + rmdir $DIR/$tfile } run_test 0 "empty replay" @@ -70,107 +45,132 @@ test_0b() { } run_test 0b "ensure object created after recover exists. (3284)" -test_1() { - replay_barrier mds - mcreate $DIR/$tfile - fail mds - $CHECKSTAT -t file $DIR/$tfile || return 1 - rm $DIR/$tfile +seq_set_width() +{ + local mds=$1 + local width=$2 + local file=`ls /proc/fs/lustre/seq/cli-srv-$mds-mdc-*/width` + echo $width > $file } -run_test 1 "simple create" -test_1a() { - do_facet ost1 "sysctl -w lustre.fail_loc=0" +seq_get_width() +{ + local mds=$1 + local file=`ls /proc/fs/lustre/seq/cli-srv-$mds-mdc-*/width` + cat $file +} - rm -fr $DIR/$tfile - local old_last_id=`cat $LPROC/obdfilter/*/last_id` - touch -o $DIR/$tfile 1 - sync - local new_last_id=`cat $LPROC/obdfilter/*/last_id` +# This test should pass for single-mds and multi-mds configs. +# But for different configurations it tests different things. +# +# single-mds +# ---------- +# (1) fld_create replay should happen; +# +# (2) fld_create replay should not return -EEXISTS, if it does +# this means sequence manager recovery code is buggy and allocated +# same sequence two times after recovery. +# +# multi-mds +# --------- +# (1) fld_create replay may not happen, because its home MDS is +# MDS2 which is not involved to revovery; +# +# (2) as fld_create does not happen on MDS1, it does not make any +# problem. +test_0c() { + local label=`mdsdevlabel 1` + [ -z "$label" ] && echo "No label for mds1" && return 1 + + replay_barrier $SINGLEMDS + local sw=`seq_get_width $label` - test "$old_last_id" = "$new_last_id" || { - echo "OST object create is caused by MDS" - return 1 - } + # make seq manager switch to next sequence each + # time as new fid is needed. + seq_set_width $label 1 - old_last_id=`cat $LPROC/obdfilter/*/last_id` - echo "data" > $DIR/$tfile - sync - new_last_id=`cat $LPROC/obdfilter/*/last_id` - test "$old_last_id" = "$new_last_id "&& { - echo "CROW does not work on write" - return 1 - } + # make sure that fld has created at least one new + # entry on server + touch $DIR/$tfile || return 2 + seq_set_width $label $sw - rm -fr $DIR/$tfile - -#define OBD_FAIL_OST_CROW_EIO | OBD_FAIL_ONCE - do_facet ost1 "sysctl -w lustre.fail_loc=0x80000801" - - rm -fr $DIR/1a1 - old_last_id=`cat $LPROC/obdfilter/*/last_id` - echo "data" > $DIR/1a1 - sync - new_last_id=`cat $LPROC/obdfilter/*/last_id` - test "$old_last_id" = "$new_last_id" || { - echo "CROW does work with fail_loc=0x80000801" - return 1 - } + # fail $SINGLEMDS and start recovery, replay RPCs, etc. + fail $SINGLEMDS - rm -fr $DIR/1a1 + # wait for recovery finish + sleep 10 + df $MOUNT - do_facet ost1 "sysctl -w lustre.fail_loc=0" + # flush fld cache and dentry cache to make it lookup + # created entry instead of revalidating existent one + umount $MOUNT + zconf_mount `hostname` $MOUNT + + # issue lookup which should call fld lookup which + # should fail if client did not replay fld create + # correctly and server has no fld entry + touch $DIR/$tfile || return 3 + rm $DIR/$tfile || return 4 +} +run_test 0c "fld create" + +test_1() { + replay_barrier $SINGLEMDS + mcreate $DIR/$tfile + fail $SINGLEMDS + $CHECKSTAT -t file $DIR/$tfile || return 1 + rm $DIR/$tfile } -#CROW run_test 1a "CROW object create (check OST last_id)" +run_test 1 "simple create" test_2a() { - replay_barrier mds + replay_barrier $SINGLEMDS touch $DIR/$tfile - fail mds + fail $SINGLEMDS $CHECKSTAT -t file $DIR/$tfile || return 1 rm $DIR/$tfile } run_test 2a "touch" test_2b() { - ./mcreate $DIR/$tfile - replay_barrier mds + mcreate $DIR/$tfile + replay_barrier $SINGLEMDS touch $DIR/$tfile - fail mds + fail $SINGLEMDS $CHECKSTAT -t file $DIR/$tfile || return 1 rm $DIR/$tfile } run_test 2b "touch" test_3a() { - replay_barrier mds + replay_barrier $SINGLEMDS mcreate $DIR/$tfile o_directory $DIR/$tfile - fail mds + fail $SINGLEMDS $CHECKSTAT -t file $DIR/$tfile || return 2 rm $DIR/$tfile } run_test 3a "replay failed open(O_DIRECTORY)" test_3b() { - replay_barrier mds + replay_barrier $SINGLEMDS #define OBD_FAIL_MDS_OPEN_PACK | OBD_FAIL_ONCE - do_facet mds "sysctl -w lustre.fail_loc=0x80000114" + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000114" touch $DIR/$tfile - do_facet mds "sysctl -w lustre.fail_loc=0" - fail mds + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0" + fail $SINGLEMDS $CHECKSTAT -t file $DIR/$tfile && return 2 return 0 } run_test 3b "replay failed open -ENOMEM" test_3c() { - replay_barrier mds + replay_barrier $SINGLEMDS #define OBD_FAIL_MDS_ALLOC_OBDO | OBD_FAIL_ONCE - do_facet mds "sysctl -w lustre.fail_loc=0x80000128" + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000128" touch $DIR/$tfile - do_facet mds "sysctl -w lustre.fail_loc=0" - fail mds + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0" + fail $SINGLEMDS $CHECKSTAT -t file $DIR/$tfile && return 2 return 0 @@ -178,11 +178,11 @@ test_3c() { run_test 3c "replay failed open -ENOMEM" test_4() { - replay_barrier mds + replay_barrier $SINGLEMDS for i in `seq 10`; do echo "tag-$i" > $DIR/$tfile-$i done - fail mds + fail $SINGLEMDS for i in `seq 10`; do grep -q "tag-$i" $DIR/$tfile-$i || error "$tfile-$i" done @@ -190,9 +190,9 @@ test_4() { run_test 4 "|x| 10 open(O_CREAT)s" test_4b() { - replay_barrier mds + replay_barrier $SINGLEMDS rm -rf $DIR/$tfile-* - fail mds + fail $SINGLEMDS $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true } run_test 4b "|x| rm 10 files" @@ -200,11 +200,11 @@ run_test 4b "|x| rm 10 files" # The idea is to get past the first block of precreated files on both # osts, and then replay. test_5() { - replay_barrier mds + replay_barrier $SINGLEMDS for i in `seq 220`; do echo "tag-$i" > $DIR/$tfile-$i done - fail mds + fail $SINGLEMDS for i in `seq 220`; do grep -q "tag-$i" $DIR/$tfile-$i || error "f1c-$i" done @@ -216,10 +216,10 @@ run_test 5 "|x| 220 open(O_CREAT)" test_6() { - replay_barrier mds + replay_barrier $SINGLEMDS mkdir $DIR/$tdir mcreate $DIR/$tdir/$tfile - fail mds + fail $SINGLEMDS $CHECKSTAT -t dir $DIR/$tdir || return 1 $CHECKSTAT -t file $DIR/$tdir/$tfile || return 2 sleep 2 @@ -228,18 +228,18 @@ test_6() { run_test 6 "mkdir + contained create" test_6b() { - replay_barrier mds + replay_barrier $SINGLEMDS rm -rf $DIR/$tdir - fail mds + fail $SINGLEMDS $CHECKSTAT -t dir $DIR/$tdir && return 1 || true } run_test 6b "|X| rmdir" test_7() { mkdir $DIR/$tdir - replay_barrier mds + replay_barrier $SINGLEMDS mcreate $DIR/$tdir/$tfile - fail mds + fail $SINGLEMDS $CHECKSTAT -t dir $DIR/$tdir || return 1 $CHECKSTAT -t file $DIR/$tdir/$tfile || return 2 rm -fr $DIR/$tdir @@ -247,11 +247,13 @@ test_7() { run_test 7 "mkdir |X| contained create" test_8() { - replay_barrier mds + # make sure no side-effect from previous test. + rm -f $DIR/$tfile + replay_barrier $SINGLEMDS multiop $DIR/$tfile mo_c & MULTIPID=$! sleep 1 - fail mds + fail $SINGLEMDS ls $DIR/$tfile $CHECKSTAT -t file $DIR/$tfile || return 1 kill -USR1 $MULTIPID || return 2 @@ -261,10 +263,10 @@ test_8() { run_test 8 "creat open |X| close" test_9() { - replay_barrier mds + replay_barrier $SINGLEMDS mcreate $DIR/$tfile local old_inum=`ls -i $DIR/$tfile | awk '{print $1}'` - fail mds + fail $SINGLEMDS local new_inum=`ls -i $DIR/$tfile | awk '{print $1}'` echo " old_inum == $old_inum, new_inum == $new_inum" @@ -281,10 +283,10 @@ run_test 9 "|X| create (same inum/gen)" test_10() { mcreate $DIR/$tfile - replay_barrier mds + replay_barrier $SINGLEMDS mv $DIR/$tfile $DIR/$tfile-2 rm -f $DIR/$tfile - fail mds + fail $SINGLEMDS $CHECKSTAT $DIR/$tfile && return 1 $CHECKSTAT $DIR/$tfile-2 ||return 2 rm $DIR/$tfile-2 @@ -296,11 +298,11 @@ test_11() { mcreate $DIR/$tfile echo "old" > $DIR/$tfile mv $DIR/$tfile $DIR/$tfile-2 - replay_barrier mds + replay_barrier $SINGLEMDS echo "new" > $DIR/$tfile grep new $DIR/$tfile grep old $DIR/$tfile-2 - fail mds + fail $SINGLEMDS grep new $DIR/$tfile || return 1 grep old $DIR/$tfile-2 || return 2 } @@ -313,11 +315,11 @@ test_12() { # give multiop a chance to open sleep 1 rm -f $DIR/$tfile - replay_barrier mds + replay_barrier $SINGLEMDS kill -USR1 $pid wait $pid || return 1 - fail mds + fail $SINGLEMDS [ -e $DIR/$tfile ] && return 2 return 0 } @@ -334,8 +336,8 @@ test_13() { sleep 1 chmod 0 $DIR/$tfile $CHECKSTAT -p 0 $DIR/$tfile - replay_barrier mds - fail mds + replay_barrier $SINGLEMDS + fail $SINGLEMDS kill -USR1 $pid wait $pid || return 1 @@ -350,11 +352,11 @@ test_14() { # give multiop a chance to open sleep 1 rm -f $DIR/$tfile - replay_barrier mds + replay_barrier $SINGLEMDS kill -USR1 $pid || return 1 wait $pid || return 2 - fail mds + fail $SINGLEMDS [ -e $DIR/$tfile ] && return 3 return 0 } @@ -366,12 +368,12 @@ test_15() { # give multiop a chance to open sleep 1 rm -f $DIR/$tfile - replay_barrier mds + replay_barrier $SINGLEMDS touch $DIR/g11 || return 1 kill -USR1 $pid wait $pid || return 2 - fail mds + fail $SINGLEMDS [ -e $DIR/$tfile ] && return 3 touch $DIR/h11 || return 4 return 0 @@ -380,11 +382,11 @@ run_test 15 "open(O_CREAT), unlink |X| touch new, close" test_16() { - replay_barrier mds + replay_barrier $SINGLEMDS mcreate $DIR/$tfile munlink $DIR/$tfile mcreate $DIR/$tfile-2 - fail mds + fail $SINGLEMDS [ -e $DIR/$tfile ] && return 1 [ -e $DIR/$tfile-2 ] || return 2 munlink $DIR/$tfile-2 || return 3 @@ -392,12 +394,12 @@ test_16() { run_test 16 "|X| open(O_CREAT), unlink, touch new, unlink new" test_17() { - replay_barrier mds + replay_barrier $SINGLEMDS multiop $DIR/$tfile O_c & pid=$! # give multiop a chance to open sleep 1 - fail mds + fail $SINGLEMDS kill -USR1 $pid || return 1 wait $pid || return 2 $CHECKSTAT -t file $DIR/$tfile || return 3 @@ -406,7 +408,7 @@ test_17() { run_test 17 "|X| open(O_CREAT), |replay| close" test_18() { - replay_barrier mds + replay_barrier $SINGLEMDS multiop $DIR/$tfile O_tSc & pid=$! # give multiop a chance to open @@ -417,7 +419,7 @@ test_18() { kill -USR1 $pid wait $pid || return 2 - fail mds + fail $SINGLEMDS [ -e $DIR/$tfile ] && return 3 [ -e $DIR/$tfile-2 ] || return 4 # this touch frequently fails @@ -430,25 +432,25 @@ run_test 18 "|X| open(O_CREAT), unlink, touch new, close, touch, unlink" # bug 1855 (a simpler form of test_11 above) test_19() { - replay_barrier mds + replay_barrier $SINGLEMDS mcreate $DIR/$tfile echo "old" > $DIR/$tfile mv $DIR/$tfile $DIR/$tfile-2 grep old $DIR/$tfile-2 - fail mds + fail $SINGLEMDS grep old $DIR/$tfile-2 || return 2 } run_test 19 "|X| mcreate, open, write, rename " test_20() { - replay_barrier mds + replay_barrier $SINGLEMDS multiop $DIR/$tfile O_tSc & pid=$! # give multiop a chance to open sleep 1 rm -f $DIR/$tfile - fail mds + fail $SINGLEMDS kill -USR1 $pid wait $pid || return 1 [ -e $DIR/$tfile ] && return 2 @@ -470,9 +472,9 @@ test_20b() { # bug 10480 mds_evict_client df -P $DIR || df -P $DIR || true # reconnect - fail mds # start orphan recovery + fail $SINGLEMDS # start orphan recovery df -P $DIR || df -P $DIR || true # reconnect - sleep 2 + wait_mds_recovery_done || error "MDS recovery not done" AFTERUSED=`df -P $DIR | tail -1 | awk '{ print $3 }'` log "before $BEFOREUSED, after $AFTERUSED" @@ -483,9 +485,10 @@ test_20b() { # bug 10480 run_test 20b "write, unlink, eviction, replay, (test mds_cleanup_orphans)" test_20c() { # bug 10480 - dd if=/dev/zero of=$DIR/$tfile bs=4k count=10000 - - exec 100< $DIR/$tfile + multiop $DIR/$tfile Ow_c & + pid=$! + # give multiop a chance to open + sleep 1 ls -la $DIR/$tfile @@ -493,8 +496,7 @@ test_20c() { # bug 10480 df -P $DIR || df -P $DIR || true # reconnect - exec 100<&- - + kill -USR1 $pid test -s $DIR/$tfile || error "File was truncated" return 0 @@ -502,7 +504,7 @@ test_20c() { # bug 10480 run_test 20c "check that client eviction does not affect file content" test_21() { - replay_barrier mds + replay_barrier $SINGLEMDS multiop $DIR/$tfile O_tSc & pid=$! # give multiop a chance to open @@ -510,7 +512,7 @@ test_21() { rm -f $DIR/$tfile touch $DIR/g11 || return 1 - fail mds + fail $SINGLEMDS kill -USR1 $pid wait $pid || return 2 [ -e $DIR/$tfile ] && return 3 @@ -525,10 +527,10 @@ test_22() { # give multiop a chance to open sleep 1 - replay_barrier mds + replay_barrier $SINGLEMDS rm -f $DIR/$tfile - fail mds + fail $SINGLEMDS kill -USR1 $pid wait $pid || return 1 [ -e $DIR/$tfile ] && return 2 @@ -542,11 +544,11 @@ test_23() { # give multiop a chance to open sleep 1 - replay_barrier mds + replay_barrier $SINGLEMDS rm -f $DIR/$tfile touch $DIR/g11 || return 1 - fail mds + fail $SINGLEMDS kill -USR1 $pid wait $pid || return 2 [ -e $DIR/$tfile ] && return 3 @@ -561,8 +563,8 @@ test_24() { # give multiop a chance to open sleep 1 - replay_barrier mds - fail mds + replay_barrier $SINGLEMDS + fail $SINGLEMDS rm -f $DIR/$tfile kill -USR1 $pid wait $pid || return 1 @@ -578,8 +580,8 @@ test_25() { sleep 1 rm -f $DIR/$tfile - replay_barrier mds - fail mds + replay_barrier $SINGLEMDS + fail $SINGLEMDS kill -USR1 $pid wait $pid || return 1 [ -e $DIR/$tfile ] && return 2 @@ -588,7 +590,7 @@ test_25() { run_test 25 "open(O_CREAT), unlink, replay, close (test mds_cleanup_orphans)" test_26() { - replay_barrier mds + replay_barrier $SINGLEMDS multiop $DIR/$tfile-1 O_tSc & pid1=$! multiop $DIR/$tfile-2 O_tSc & @@ -600,7 +602,7 @@ test_26() { kill -USR1 $pid2 wait $pid2 || return 1 - fail mds + fail $SINGLEMDS kill -USR1 $pid1 wait $pid1 || return 2 [ -e $DIR/$tfile-1 ] && return 3 @@ -610,7 +612,7 @@ test_26() { run_test 26 "|X| open(O_CREAT), unlink two, close one, replay, close one (test mds_cleanup_orphans)" test_27() { - replay_barrier mds + replay_barrier $SINGLEMDS multiop $DIR/$tfile-1 O_tSc & pid1=$! multiop $DIR/$tfile-2 O_tSc & @@ -620,7 +622,7 @@ test_27() { rm -f $DIR/$tfile-1 rm -f $DIR/$tfile-2 - fail mds + fail $SINGLEMDS kill -USR1 $pid1 wait $pid1 || return 1 kill -USR1 $pid2 @@ -638,13 +640,13 @@ test_28() { pid2=$! # give multiop a chance to open sleep 1 - replay_barrier mds + replay_barrier $SINGLEMDS rm -f $DIR/$tfile-1 rm -f $DIR/$tfile-2 kill -USR1 $pid2 wait $pid2 || return 1 - fail mds + fail $SINGLEMDS kill -USR1 $pid1 wait $pid1 || return 2 [ -e $DIR/$tfile-1 ] && return 3 @@ -660,11 +662,11 @@ test_29() { pid2=$! # give multiop a chance to open sleep 1 - replay_barrier mds + replay_barrier $SINGLEMDS rm -f $DIR/$tfile-1 rm -f $DIR/$tfile-2 - fail mds + fail $SINGLEMDS kill -USR1 $pid1 wait $pid1 || return 1 kill -USR1 $pid2 @@ -685,8 +687,8 @@ test_30() { rm -f $DIR/$tfile-1 rm -f $DIR/$tfile-2 - replay_barrier mds - fail mds + replay_barrier $SINGLEMDS + fail $SINGLEMDS kill -USR1 $pid1 wait $pid1 || return 1 kill -USR1 $pid2 @@ -706,9 +708,9 @@ test_31() { sleep 1 rm -f $DIR/$tfile-1 - replay_barrier mds + replay_barrier $SINGLEMDS rm -f $DIR/$tfile-2 - fail mds + fail $SINGLEMDS kill -USR1 $pid1 wait $pid1 || return 1 kill -USR1 $pid2 @@ -739,15 +741,29 @@ run_test 32 "close() notices client eviction; close() after client eviction" # Abort recovery before client complete test_33() { - replay_barrier mds - touch $DIR/$tfile - fail_abort mds + replay_barrier $SINGLEMDS + createmany -o $DIR/$tfile-%d 100 + fail_abort $SINGLEMDS # this file should be gone, because the replay was aborted - $CHECKSTAT -t file $DIR/$tfile && return 3 + $CHECKSTAT -t file $DIR/$tfile-* && return 3 + unlinkmany $DIR/$tfile-%d 0 100 return 0 } run_test 33 "abort recovery before client does replay" +# Stale FID sequence +test_33a() { + replay_barrier $SINGLEMDS + createmany -o $DIR/$tfile-%d 10 + fail_abort $SINGLEMDS + unlinkmany $DIR/$tfile-%d 0 10 + # recreate shouldn't fail + createmany -o $DIR/$tfile-%d 10 || return 3 + unlinkmany $DIR/$tfile-%d 0 10 + return 0 +} +run_test 33a "fid shouldn't be reused after abort recovery" + test_34() { multiop $DIR/$tfile O_c & pid=$! @@ -755,8 +771,8 @@ test_34() { sleep 1 rm -f $DIR/$tfile - replay_barrier mds - fail_abort mds + replay_barrier $SINGLEMDS + fail_abort $SINGLEMDS kill -USR1 $pid [ -e $DIR/$tfile ] && return 1 sync @@ -769,13 +785,13 @@ test_35() { touch $DIR/$tfile #define OBD_FAIL_MDS_REINT_NET_REP 0x119 - do_facet mds "sysctl -w lustre.fail_loc=0x80000119" + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000119" rm -f $DIR/$tfile & sleep 1 sync sleep 1 # give a chance to remove from MDS - fail_abort mds + fail_abort $SINGLEMDS $CHECKSTAT -t file $DIR/$tfile && return 1 || true } run_test 35 "test recovery from llog for unlink op" @@ -783,10 +799,10 @@ run_test 35 "test recovery from llog for unlink op" # b=2432 resent cancel after replay uses wrong cookie, # so don't resend cancels test_36() { - replay_barrier mds + replay_barrier $SINGLEMDS touch $DIR/$tfile checkstat $DIR/$tfile - facet_failover mds + facet_failover $SINGLEMDS cancel_lru_locks mdc if dmesg | grep "unknown lock cookie"; then echo "cancel after replay failed" @@ -805,10 +821,10 @@ test_37() { sleep 1 rmdir $DIR/$tfile - replay_barrier mds + replay_barrier $SINGLEMDS # clear the dmesg buffer so we only see errors from this recovery dmesg -c >/dev/null - fail_abort mds + fail_abort $SINGLEMDS kill -USR1 $pid dmesg | grep "mds_unlink_orphan.*error .* unlinking orphan" && return 1 sync @@ -819,8 +835,8 @@ run_test 37 "abort recovery before client does replay (test mds_cleanup_orphans test_38() { createmany -o $DIR/$tfile-%d 800 unlinkmany $DIR/$tfile-%d 0 400 - replay_barrier mds - fail mds + replay_barrier $SINGLEMDS + fail $SINGLEMDS unlinkmany $DIR/$tfile-%d 400 400 sleep 2 $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true @@ -829,12 +845,11 @@ run_test 38 "test recovery from unlink llog (test llog_gen_rec) " test_39() { # bug 4176 createmany -o $DIR/$tfile-%d 800 - replay_barrier mds + replay_barrier $SINGLEMDS unlinkmany $DIR/$tfile-%d 0 400 - fail mds + fail $SINGLEMDS unlinkmany $DIR/$tfile-%d 400 400 sleep 2 - ls -1f $DIR/$tfile-* $CHECKSTAT -t file $DIR/$tfile-* && return 1 || true } run_test 39 "test recovery from unlink llog (test llog_gen_rec) " @@ -851,9 +866,9 @@ test_40(){ writeme -s $MOUNT/${tfile}-2 & WRITE_PID=$! sleep 1 - facet_failover mds + facet_failover $SINGLEMDS #define OBD_FAIL_MDS_CONNECT_NET 0x117 - do_facet mds "sysctl -w lustre.fail_loc=0x80000117" + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000117" kill -USR1 $PID stat1=`count_ost_writes` sleep $TIMEOUT @@ -887,17 +902,21 @@ 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 "skipping test 41: we don't have a second OST to test with" && \ + return + local f=$MOUNT/$tfile # make sure the start of the file is ost1 lfs setstripe $f $((128 * 1024)) 0 0 do_facet client dd if=/dev/zero of=$f bs=4k count=1 || return 3 cancel_lru_locks osc # fail ost2 and read from ost1 - local osc2dev=`grep ${ost2_svc}-osc- $LPROC/devices | awk '{print $1}'` - [ "$osc2dev" ] || return 4 - $LCTL --device $osc2dev deactivate || return 1 + local osc2dev=`do_facet mds "grep ${ost2_svc}-osc-MDT0000 $LPROC/devices" | awk '{print $1}'` + [ -z "$osc2dev" ] && echo "OST: $ost2_svc" && cat $LPROC/devices && return 4 + do_facet mds $LCTL --device $osc2dev deactivate || return 1 do_facet client dd if=$f of=/dev/null bs=4k count=1 || return 3 - $LCTL --device $osc2dev activate || return 2 + do_facet mds $LCTL --device $osc2dev activate || return 2 return 0 } run_test 41 "read from a valid osc while other oscs are invalid" @@ -908,7 +927,7 @@ test_42() { createmany -o $DIR/$tfile-%d 800 replay_barrier ost1 unlinkmany $DIR/$tfile-%d 0 400 - DEBUG42="`sysctl -n lnet.debug`" + debugsave sysctl -w lnet.debug=-1 facet_failover ost1 @@ -917,7 +936,7 @@ test_42() { #[ $blocks_after -lt $blocks ] || return 1 echo wait for MDS to timeout and recover sleep $((TIMEOUT * 2)) - sysctl -w lnet.debug=$DEBUG42 + debugrestore unlinkmany $DIR/$tfile-%d 400 400 $CHECKSTAT -t file $DIR/$tfile-* && return 2 || true } @@ -925,11 +944,11 @@ run_test 42 "recovery after ost failure" # timeout in MDS/OST recovery RPC will LBUG MDS test_43() { # bug 2530 - replay_barrier mds + replay_barrier $SINGLEMDS # OBD_FAIL_OST_CREATE_NET 0x204 do_facet ost1 "sysctl -w lustre.fail_loc=0x80000204" - fail mds + fail $SINGLEMDS sleep 10 do_facet ost1 "sysctl -w lustre.fail_loc=0" @@ -938,36 +957,36 @@ test_43() { # bug 2530 run_test 43 "mds osc import failure during recovery; don't LBUG" test_44() { - mdcdev=`awk '/-mdc-/ {print $1}' $LPROC/devices` + mdcdev=`awk '/MDT0000-mdc-/ {print $1}' $LPROC/devices` [ "$mdcdev" ] || exit 2 for i in `seq 1 10`; do #define OBD_FAIL_TGT_CONN_RACE 0x701 - do_facet mds "sysctl -w lustre.fail_loc=0x80000701" + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000701" $LCTL --device $mdcdev recover df $MOUNT done - do_facet mds "sysctl -w lustre.fail_loc=0" + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0" return 0 } run_test 44 "race in target handle connect" test_44b() { - mdcdev=`awk '/-mdc-/ {print $1}' $LPROC/devices` + mdcdev=`awk '/MDT0000-mdc-/ {print $1}' $LPROC/devices` [ "$mdcdev" ] || exit 2 for i in `seq 1 10`; do #define OBD_FAIL_TGT_DELAY_RECONNECT 0x704 - do_facet mds "sysctl -w lustre.fail_loc=0x80000704" + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000704" $LCTL --device $mdcdev recover df $MOUNT done - do_facet mds "sysctl -w lustre.fail_loc=0" + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0" return 0 } run_test 44b "race in target handle connect" # Handle failed close test_45() { - mdcdev=`awk '/-mdc-/ {print $1}' $LPROC/devices` + mdcdev=`awk '/MDT0000-mdc-/ {print $1}' $LPROC/devices` [ "$mdcdev" ] || exit 2 $LCTL --device $mdcdev recover @@ -994,7 +1013,7 @@ run_test 45 "Handle failed close" test_46() { dmesg -c >/dev/null drop_reply "touch $DIR/$tfile" - fail mds + fail $SINGLEMDS # ironically, the previous test, 45, will cause a real forced close, # so just look for one for this test dmesg | grep -i "force closing client file handle for $tfile" && return 1 @@ -1026,10 +1045,10 @@ test_47() { # bug 2824 run_test 47 "MDS->OSC failure during precreate cleanup (2824)" test_48() { - replay_barrier mds + replay_barrier $SINGLEMDS createmany -o $DIR/$tfile 20 || return 1 # OBD_FAIL_OST_EROFS 0x216 - fail mds + fail $SINGLEMDS do_facet ost1 "sysctl -w lustre.fail_loc=0x80000216" df $MOUNT || return 2 @@ -1042,7 +1061,7 @@ test_48() { run_test 48 "MDS->OSC failure during precreate cleanup (2824)" test_50() { - local oscdev=`grep ${ost1_svc}-osc- $LPROC/devices | awk '{print $1}'` + local oscdev=`grep ${ost1_svc}-osc-MDT0000 $LPROC/devices | awk '{print $1}'` [ "$oscdev" ] || return 1 $LCTL --device $oscdev recover && $LCTL --device $oscdev recover # give the mds_lov_sync threads a chance to run @@ -1056,11 +1075,11 @@ test_52() { cancel_lru_locks mdc multiop $DIR/$tfile s || return 1 - replay_barrier mds + replay_barrier $SINGLEMDS #define OBD_FAIL_LDLM_REPLY 0x30c - do_facet mds "sysctl -w lustre.fail_loc=0x8000030c" - fail mds || return 2 - do_facet mds "sysctl -w lustre.fail_loc=0x0" + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x8000030c" + fail $SINGLEMDS || return 2 + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x0" $CHECKSTAT -t file $DIR/$tfile-* && return 3 || true } @@ -1072,11 +1091,11 @@ run_test 52 "time out lock replay (3764)" #b3761 ASSERTION(hash != 0) failed test_55() { # OBD_FAIL_MDS_OPEN_CREATE | OBD_FAIL_ONCE - do_facet mds "sysctl -w lustre.fail_loc=0x8000012b" + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x8000012b" touch $DIR/$tfile & # give touch a chance to run sleep 5 - do_facet mds "sysctl -w lustre.fail_loc=0x0" + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x0" rm $DIR/$tfile return 0 } @@ -1085,9 +1104,9 @@ run_test 55 "let MDS_CHECK_RESENT return the original return code instead of 0" #b3440 ASSERTION(rec->ur_fid2->id) failed test_56() { ln -s foo $DIR/$tfile - replay_barrier mds + replay_barrier $SINGLEMDS #drop_reply "cat $DIR/$tfile" - fail mds + fail $SINGLEMDS sleep 10 } run_test 56 "don't replay a symlink open request (3440)" @@ -1095,13 +1114,13 @@ run_test 56 "don't replay a symlink open request (3440)" #recovery one mds-ost setattr from llog test_57() { #define OBD_FAIL_MDS_OST_SETATTR 0x12c - do_facet mds "sysctl -w lustre.fail_loc=0x8000012c" + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x8000012c" touch $DIR/$tfile - replay_barrier mds - fail mds + replay_barrier $SINGLEMDS + fail $SINGLEMDS sleep 1 $CHECKSTAT -t file $DIR/$tfile || return 1 - do_facet mds "sysctl -w lustre.fail_loc=0x0" + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x0" rm $DIR/$tfile } run_test 57 "test recovery from llog for setattr op" @@ -1109,18 +1128,50 @@ run_test 57 "test recovery from llog for setattr op" #recovery many mds-ost setattr from llog test_58() { #define OBD_FAIL_MDS_OST_SETATTR 0x12c - do_facet mds "sysctl -w lustre.fail_loc=0x8000012c" + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x8000012c" mkdir $DIR/$tdir createmany -o $DIR/$tdir/$tfile-%d 2500 - replay_barrier mds - fail mds + replay_barrier $SINGLEMDS + fail $SINGLEMDS sleep 2 $CHECKSTAT -t file $DIR/$tdir/$tfile-* || return 1 - do_facet mds "sysctl -w lustre.fail_loc=0x0" + do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x0" unlinkmany $DIR/$tdir/$tfile-%d 2500 rmdir $DIR/$tdir } run_test 58 "test recovery from llog for setattr op (test llog_gen_rec)" +# log_commit_thread vs filter_destroy race used to lead to import use after free +# bug 11658 +test_59() { + mkdir $DIR/$tdir + createmany -o $DIR/$tdir/$tfile-%d 200 + sync + unlinkmany $DIR/$tdir/$tfile-%d 200 +#define OBD_FAIL_PTLRPC_DELAY_RECOV 0x507 + do_facet ost1 "sysctl -w lustre.fail_loc=0x507" + fail ost1 + fail $SINGLEMDS + do_facet ost1 "sysctl -w lustre.fail_loc=0x0" + sleep 20 + rmdir $DIR/$tdir +} +run_test 59 "test log_commit_thread vs filter_destroy race" + +# race between add unlink llog vs cat log init in post_recovery (only for b1_6) +# bug 12086: should no oops and No ctxt error for this test +test_60() { + mkdir $DIR/$tdir + createmany -o $DIR/$tdir/$tfile-%d 200 + replay_barrier $SINGLEMDS + unlinkmany $DIR/$tdir/$tfile-%d 0 100 + fail $SINGLEMDS + unlinkmany $DIR/$tdir/$tfile-%d 100 100 + local no_ctxt=`dmesg | grep "No ctxt"` + [ -z "$no_ctxt" ] || error "ctxt is not initialized in recovery" +} +run_test 60 "test llog post recovery init vs llog unlink" + equals_msg `basename $0`: test complete, cleaning up -$CLEANUP +check_and_cleanup_lustre +[ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG || true