X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Frecovery-small.sh;h=5b09a2e413b846d86b63ceda5d59d2b93d7fc236;hp=87b87afe485218279266d2da05fd656e7acf41ff;hb=db7c55c3441d058ca3f9c055b46fef18330674fc;hpb=3a25a5e0f4d00e9dd31eb3257861dc18a12f02ad diff --git a/lustre/tests/recovery-small.sh b/lustre/tests/recovery-small.sh index 87b87af..5b09a2e 100755 --- a/lustre/tests/recovery-small.sh +++ b/lustre/tests/recovery-small.sh @@ -218,7 +218,7 @@ test_17() { remote_ost_nodsh && skip "remote OST with nodsh" && return 0 # With adaptive timeouts, bulk_get won't expire until adaptive_timeout_max - if at_is_valid && at_is_enabled; then + if at_is_enabled; then at_max_saved=$(at_max_get ost1) at_max_set $TIMEOUT ost1 fi @@ -239,7 +239,7 @@ test_17() { # expect cmp to succeed, client resent bulk do_facet client "cmp /etc/termcap $DIR/$tfile" || return 3 do_facet client "rm $DIR/$tfile" || return 4 - [ $at_max_saved -ne 0 ] && $(at_max_set $at_max_saved ost1) + [ $at_max_saved -ne 0 ] && at_max_set $at_max_saved ost1 return 0 } run_test 17 "timeout bulk get, don't evict client (2732)" @@ -255,6 +255,11 @@ test_18a() { # 1 stripe on ost2 lfs setstripe $f -s $((128 * 1024)) -i 1 -c 1 + get_stripe_info client $f + if [ $stripe_index -ne 1 ]; then + lfs getstripe $f + error "$f: different stripe offset ($stripe_index)" && return + fi do_facet client cp $SAMPLE_FILE $f sync @@ -275,14 +280,17 @@ test_18b() { do_facet client mkdir -p $DIR/$tdir f=$DIR/$tdir/$tfile - f2=$DIR/$tdir/${tfile}-2 cancel_lru_locks osc pgcache_empty || return 1 # shouldn't have to set stripe size of count==1 lfs setstripe $f -s $((128 * 1024)) -i 0 -c 1 - lfs setstripe $f2 -s $((128 * 1024)) -i 0 -c 1 + get_stripe_info client $f + if [ $stripe_index -ne 0 ]; then + lfs getstripe $f + error "$f: different stripe offset ($stripe_index)" && return + fi do_facet client cp $SAMPLE_FILE $f sync @@ -293,7 +301,7 @@ test_18b() { # cache after the client reconnects? rc=0 pgcache_empty || rc=2 - rm -f $f $f2 + rm -f $f return $rc } run_test 18b "eviction and reconnect clears page cache (2766)" @@ -303,14 +311,17 @@ test_18c() { do_facet client mkdir -p $DIR/$tdir f=$DIR/$tdir/$tfile - f2=$DIR/$tdir/${tfile}-2 cancel_lru_locks osc pgcache_empty || return 1 # shouldn't have to set stripe size of count==1 lfs setstripe $f -s $((128 * 1024)) -i 0 -c 1 - lfs setstripe $f2 -s $((128 * 1024)) -i 0 -c 1 + get_stripe_info client $f + if [ $stripe_index -ne 0 ]; then + lfs getstripe $f + error "$f: different stripe offset ($stripe_index)" && return + fi do_facet client cp $SAMPLE_FILE $f sync @@ -326,7 +337,7 @@ test_18c() { # cache after the client reconnects? rc=0 pgcache_empty || rc=2 - rm -f $f $f2 + rm -f $f return $rc } run_test 18c "Dropped connect reply after eviction handing (14755)" @@ -633,54 +644,65 @@ test_24() { # bug 11710 details correct fsync() behavior } run_test 24 "fsync error (should return error)" +wait_client_evicted () { + local facet=$1 + local exports=$2 + local varsvc=${facet}_svc + + wait_update $(facet_host $facet) "lctl get_param -n *.${!varsvc}.num_exports | cut -d' ' -f2" $((exports - 1)) $3 +} + test_26a() { # was test_26 bug 5921 - evict dead exports by pinger # this test can only run from a client on a separate node. remote_ost || { skip "local OST" && return 0; } remote_ost_nodsh && skip "remote OST with nodsh" && return 0 remote_mds || { skip "local MDS" && return 0; } - OST_FILE=obdfilter.${ost1_svc}.num_exports - OST_EXP="`do_facet ost1 lctl get_param -n $OST_FILE`" - OST_NEXP1=`echo $OST_EXP | cut -d' ' -f2` - echo starting with $OST_NEXP1 OST exports + + check_timeout || return 1 + + local OST_NEXP=$(do_facet ost1 lctl get_param -n obdfilter.${ost1_svc}.num_exports | cut -d' ' -f2) + + echo starting with $OST_NEXP OST exports # OBD_FAIL_PTLRPC_DROP_RPC 0x505 do_facet client lctl set_param fail_loc=0x505 # evictor takes PING_EVICT_TIMEOUT + 3 * PING_INTERVAL to evict. # But if there's a race to start the evictor from various obds, # the loser might have to wait for the next ping. - echo Waiting for $(($TIMEOUT * 8)) secs - sleep $(($TIMEOUT * 8)) - OST_EXP="`do_facet ost1 lctl get_param -n $OST_FILE`" - OST_NEXP2=`echo $OST_EXP | cut -d' ' -f2` - echo ending with $OST_NEXP2 OST exports + + local rc=0 + wait_client_evicted ost1 $OST_NEXP $((TIMEOUT * 2 + TIMEOUT * 3 / 4)) + rc=$? do_facet client lctl set_param fail_loc=0x0 - [ $OST_NEXP1 -le $OST_NEXP2 ] && error "client not evicted" - return 0 + [ $rc -eq 0 ] || error "client not evicted from OST" } run_test 26a "evict dead exports" test_26b() { # bug 10140 - evict dead exports by pinger remote_ost_nodsh && skip "remote OST with nodsh" && return 0 + check_timeout || return 1 client_df - zconf_mount `hostname` $MOUNT2 || error "Failed to mount $MOUNT2" - sleep 1 # wait connections being established - MDS_FILE=mdt.${mds1_svc}.num_exports - MDS_NEXP1="`do_facet $SINGLEMDS lctl get_param -n $MDS_FILE | cut -d' ' -f2`" - OST_FILE=obdfilter.${ost1_svc}.num_exports - OST_NEXP1="`do_facet ost1 lctl get_param -n $OST_FILE | cut -d' ' -f2`" - echo starting with $OST_NEXP1 OST and $MDS_NEXP1 MDS exports - zconf_umount `hostname` $MOUNT2 -f - # evictor takes PING_EVICT_TIMEOUT + 3 * PING_INTERVAL to evict. - # But if there's a race to start the evictor from various obds, - # the loser might have to wait for the next ping. - echo Waiting for $(($TIMEOUT * 3)) secs - sleep $(($TIMEOUT * 3)) - OST_NEXP2="`do_facet ost1 lctl get_param -n $OST_FILE | cut -d' ' -f2`" - MDS_NEXP2="`do_facet $SINGLEMDS lctl get_param -n $MDS_FILE | cut -d' ' -f2`" - echo ending with $OST_NEXP2 OST and $MDS_NEXP2 MDS exports - [ $OST_NEXP1 -le $OST_NEXP2 ] && error "client not evicted from OST" - [ $MDS_NEXP1 -le $MDS_NEXP2 ] && error "client not evicted from MDS" - return 0 + zconf_mount `hostname` $MOUNT2 || error "Failed to mount $MOUNT2" + sleep 1 # wait connections being established + + local MDS_NEXP=$(do_facet $SINGLEMDS lctl get_param -n mdt.${mds1_svc}.num_exports | cut -d' ' -f2) + local OST_NEXP=$(do_facet ost1 lctl get_param -n obdfilter.${ost1_svc}.num_exports | cut -d' ' -f2) + + echo starting with $OST_NEXP OST and $MDS_NEXP MDS exports + + zconf_umount `hostname` $MOUNT2 -f + + # evictor takes PING_EVICT_TIMEOUT + 3 * PING_INTERVAL to evict. + # But if there's a race to start the evictor from various obds, + # the loser might have to wait for the next ping. + # PING_INTERVAL max(obd_timeout / 4, 1U) + # sleep (2*PING_INTERVAL) + + local rc=0 + wait_client_evicted ost1 $OST_NEXP $((TIMEOUT * 2 + TIMEOUT * 3 / 4)) || \ + error "Client was not evicted by ost" rc=1 + wait_client_evicted $SINGLEMDS $MDS_NEXP $((TIMEOUT * 2 + TIMEOUT * 3 / 4)) || \ + error "Client was not evicted by mds" } run_test 26b "evict dead exports" @@ -960,6 +982,92 @@ test_59() { # bug 10589 } run_test 59 "Read cancel race on client eviction" +err17935 () { + # we assume that all md changes are in the MDT0 changelog + if [ $MDSCOUNT -gt 1 ]; then + error_ignore 17935 $* + else + error $* + fi +} + +test_60() { + MDT0=$($LCTL get_param -n mdc.*.mds_server_uuid | \ + awk '{gsub(/_UUID/,""); print $1}' | head -1) + + NUM_FILES=15000 + mkdir -p $DIR/$tdir + + # Register (and start) changelog + USER=$(do_facet $SINGLEMDS lctl --device $MDT0 changelog_register -n) + echo "Registered as $MDT0 changelog user $USER" + + # Generate a large number of changelog entries + createmany -o $DIR/$tdir/$tfile $NUM_FILES + sync + sleep 5 + + # Unlink files in the background + unlinkmany $DIR/$tdir/$tfile $NUM_FILES & + CLIENT_PID=$! + sleep 1 + + # Failover the MDS while unlinks are happening + facet_failover $SINGLEMDS + + # Wait for unlinkmany to finish + wait $CLIENT_PID + + # Check if all the create/unlink events were recorded + # in the changelog + $LFS changelog $MDT0 >> $DIR/$tdir/changelog + local cl_count=$(grep UNLNK $DIR/$tdir/changelog | wc -l) + echo "$cl_count unlinks in $MDT0 changelog" + + do_facet $SINGLEMDS lctl --device $MDT0 changelog_deregister $USER + USERS=$(( $(do_facet $SINGLEMDS lctl get_param -n \ + mdd.$MDT0.changelog_users | wc -l) - 2 )) + if [ $USERS -eq 0 ]; then + [ $cl_count -eq $NUM_FILES ] || \ + err17935 "Recorded ${cl_count} unlinks out of $NUM_FILES" + # Also make sure we can clear large changelogs + cl_count=$($LFS changelog $FSNAME | wc -l) + [ $cl_count -le 2 ] || \ + error "Changelog not empty: $cl_count entries" + else + # If there are other users, there may be other unlinks in the log + [ $cl_count -ge $NUM_FILES ] || \ + err17935 "Recorded ${cl_count} unlinks out of $NUM_FILES" + echo "$USERS other changelog users; can't verify clear" + fi +} +run_test 60 "Add Changelog entries during MDS failover" + +test_61() +{ + local cflags='osc.*-OST0000-osc-MDT*.connect_flags' + do_facet $SINGLEMDS "lctl get_param -n $cflags" |grep -q skip_orphan + [ $? -ne 0 ] && skip "don't have skip orphan feature" && return + + mkdir -p $DIR/$tdir || error "mkdir dir $DIR/$tdir failed" + # Set the default stripe of $DIR/$tdir to put the files to ost1 + $LFS setstripe -c 1 --index 0 $DIR/$tdir + + replay_barrier $SINGLEMDS + createmany -o $DIR/$tdir/$tfile-%d 10 + local oid=`do_facet ost1 "lctl get_param -n obdfilter.*OST0000.last_id"` + + fail_abort $SINGLEMDS + + touch $DIR/$tdir/$tfile + local id=`$LFS getstripe $DIR/$tdir/$tfile |awk '$2 ~ /^[1-9]+/ {print $2}'` + [ $id -le $oid ] && error "the orphan objid was reused, failed" + + # Cleanup + rm -rf $DIR/$tdir +} +run_test 61 "Verify to not reuse orphan objects - bug 17025" + equals_msg `basename $0`: test complete, cleaning up check_and_cleanup_lustre -[ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG || true +[ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && grep -q FAIL $TESTSUITELOG && exit 1 || true