The mmp.sh test_9 often fail for the script killing the e2fsck process
on wrong timing, so we use some tricky way to make sure the MMP block
stay in 'e2fsck' state before mounting the device.
Signed-off-by: Niu Yawei <niu@whamcloud.com>
Change-Id: Id8b13b67d6f0f1f0198b13bca55356ab95af1059
Reviewed-on: http://review.whamcloud.com/979
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Hudson
Reviewed-by: Oleg Drokin <green@whamcloud.com>
noinst_SCRIPTS += run_dbench.sh run_IOR.sh recovery-double-scale.sh
noinst_SCRIPTS += recovery-random-scale.sh parallel-scale.sh metadata-updates.sh
noinst_SCRIPTS += lustre-rsync-test.sh ost-pools.sh rpc.sh yaml.sh liblustre.sh
noinst_SCRIPTS += run_dbench.sh run_IOR.sh recovery-double-scale.sh
noinst_SCRIPTS += recovery-random-scale.sh parallel-scale.sh metadata-updates.sh
noinst_SCRIPTS += lustre-rsync-test.sh ost-pools.sh rpc.sh yaml.sh liblustre.sh
-noinst_SCRIPTS += lnet-selftest.sh obdfilter-survey.sh mmp.sh
+noinst_SCRIPTS += lnet-selftest.sh obdfilter-survey.sh mmp.sh mmp_mark.sh
noinst_SCRIPTS += sgpdd-survey.sh maloo_upload.sh auster
nobase_noinst_SCRIPTS = cfg/local.sh
nobase_noinst_SCRIPTS += test-groups/regression test-groups/regression-mpi
noinst_SCRIPTS += sgpdd-survey.sh maloo_upload.sh auster
nobase_noinst_SCRIPTS = cfg/local.sh
nobase_noinst_SCRIPTS += test-groups/regression test-groups/regression-mpi
return ${PIPESTATUS[0]}
}
return ${PIPESTATUS[0]}
}
+# Set the MMP block to 'fsck' state
+mark_mmp_block() {
+ local facet=$1
+ local device=$2
+
+ do_facet $facet "$LUSTRE/tests/mmp_mark.sh $device"
+ return ${PIPESTATUS[0]}
+}
+
# Reset the MMP block (if any) back to the clean state.
reset_mmp_block() {
local facet=$1
# Reset the MMP block (if any) back to the clean state.
reset_mmp_block() {
local facet=$1
# Test 9 - mount after aborted e2fsck (should never succeed).
test_9() {
# Test 9 - mount after aborted e2fsck (should never succeed).
test_9() {
- local e2fsck_pid
- local mdt_mmp_check_interval
- local ost_mmp_check_interval
-
start $MMP_MDS $MMP_MDSDEV $MDS_MOUNT_OPTS || return ${PIPESTATUS[0]}
if ! start $MMP_OSS $MMP_OSTDEV $OST_MOUNT_OPTS; then
local rc=${PIPESTATUS[0]}
start $MMP_MDS $MMP_MDSDEV $MDS_MOUNT_OPTS || return ${PIPESTATUS[0]}
if ! start $MMP_OSS $MMP_OSTDEV $OST_MOUNT_OPTS; then
local rc=${PIPESTATUS[0]}
fi
stop_services primary || return ${PIPESTATUS[0]}
fi
stop_services primary || return ${PIPESTATUS[0]}
- mdt_mmp_check_interval=$(get_mmp_check_interval $MMP_MDS $MMP_MDSDEV)
- run_e2fsck $MMP_MDS_FAILOVER $MMP_MDSDEV "-fy" &
- e2fsck_pid=$!
- sleep $((2 * $mdt_mmp_check_interval))
- kill -s ABRT $e2fsck_pid
-
+ mark_mmp_block $MMP_MDS $MMP_MDSDEV || return ${PIPESTATUS[0]}
+
log "Mounting $MMP_MDSDEV on $MMP_MDS..."
if start $MMP_MDS $MMP_MDSDEV $MDS_MOUNT_OPTS; then
error_noexit "mount $MMP_MDSDEV on $MMP_MDS should fail"
log "Mounting $MMP_MDSDEV on $MMP_MDS..."
if start $MMP_MDS $MMP_MDSDEV $MDS_MOUNT_OPTS; then
error_noexit "mount $MMP_MDSDEV on $MMP_MDS should fail"
reset_mmp_block $MMP_MDS $MMP_MDSDEV || return ${PIPESTATUS[0]}
reset_mmp_block $MMP_MDS $MMP_MDSDEV || return ${PIPESTATUS[0]}
- echo
- ost_mmp_check_interval=$(get_mmp_check_interval $MMP_OSS $MMP_OSTDEV)
- run_e2fsck $MMP_OSS_FAILOVER $MMP_OSTDEV "-fy" &
- e2fsck_pid=$!
- sleep $((2 * $ost_mmp_check_interval))
- kill -s ABRT $e2fsck_pid
+ mark_mmp_block $MMP_OSS $MMP_OSTDEV || return ${PIPESTATUS[0]}
log "Mounting $MMP_OSTDEV on $MMP_OSS..."
if start $MMP_OSS $MMP_OSTDEV $OST_MOUNT_OPTS; then
log "Mounting $MMP_OSTDEV on $MMP_OSS..."
if start $MMP_OSS $MMP_OSTDEV $OST_MOUNT_OPTS; then
--- /dev/null
+#!/bin/bash
+# this will cause debugfs to create the /tmp/debugfs.mark file once it has
+# passed the MMP startup, then continue reading input until it is killed
+MARKFILE=$(mktemp)
+DEBUGFS=${DEBUGFS:-debugfs}
+DEVICE=$1
+
+rm -f $MARKFILE
+echo "$DEBUGFS -w $DEVICE"
+{ echo "dump_inode <2> $MARKFILE"; cat /dev/zero; } | $DEBUGFS -w $DEVICE &
+debugfspid=$!
+while [ ! -e $MARKFILE ]; do
+ sleep 1
+done
+rm -f $MARKFILE
+kill -9 $debugfspid