# Get MMP update interval (in seconds) from the Lustre server target.
get_mmp_update_interval() {
- local facet=$1
- local device=$2
- local interval
-
- interval=$(do_facet $facet "$DEBUGFS -c -R dump_mmp $device 2>/dev/null \
- | grep 'MMP Update Interval' | cut -d' ' -f4")
- [ -z "$interval" ] && interval=1
-
- echo $interval
+ local facet=$1
+ local device=$2
+ local interval
+
+ interval=$(do_facet $facet \
+ "$DEBUGFS -c -R dump_mmp $device 2>$TMP/mmp.debugfs.msg" |
+ awk 'tolower($0) ~ /update.interval/ { print $NF }')
+ [ -z "$interval" ] && interval=5 &&
+ do_facet $facet cat $TMP/mmp.debugfs.msg &&
+ echo "$facet:$device: assume update interval=$interval" 1>&2 ||
+ echo "$facet:$device: got actual update interval=$interval" 1>&2
+
+ echo $interval
}
# Get MMP check interval (in seconds) from the Lustre server target.
get_mmp_check_interval() {
- local facet=$1
- local device=$2
- local interval
+ local facet=$1
+ local device=$2
+ local interval
+
+ interval=$(do_facet $facet \
+ "$DEBUGFS -c -R dump_mmp $device 2>$TMP/mmp.debugfs.msg" |
+ awk 'tolower($0) ~ /check.interval/ { print $NF }')
+ [ -z "$interval" ] && interval=5 &&
+ do_facet $facet cat $TMP/mmp.debugfs.msg &&
+ echo "$facet:$device: assume check interval=$interval" 1>&2 ||
+ echo "$facet:$device: got actual check interval=$interval" 1>&2
+
+ echo $interval
+}
- interval=$(do_facet $facet "$DEBUGFS -c -R dump_mmp $device 2>/dev/null \
- | grep 'MMP Check Interval' | cut -d' ' -f4")
- [ -z "$interval" ] && interval=5
+# Adjust the MMP update interval (in seconds) on the Lustre server target.
+# Specifying an interval of 0 means to use the default interval.
+set_mmp_update_interval() {
+ local facet=$1
+ local device=$2
+ local interval=${3:-0}
- echo $interval
+ do_facet $facet "$TUNE2FS -E mmp_update_interval=$interval $device"
+ return ${PIPESTATUS[0]}
}
+I_ENABLED_MDS=0
+I_ENABLED_OSS=0
+
# Enable the MMP feature on the Lustre server targets.
mmp_init() {
init_vars
exit
fi
- # The MMP feature is automatically enabled by mkfs.lustre for
- # new file system at format time if failover is being used.
- # Otherwise, the Lustre administrator has to manually enable
- # this feature when the file system is unmounted.
-
- local var=${MMP_MDS}failover_HOST
- if [ -z "${!var}" ]; then
- log "Failover is not used on MDS, enabling MMP manually..."
- enable_mmp $MMP_MDS $MMP_MDSDEV || \
- error "failed to enable MMP on $MMP_MDSDEV on $MMP_MDS"
- fi
-
- var=${MMP_OSS}failover_HOST
- if [ -z "${!var}" ]; then
- log "Failover is not used on OSS, enabling MMP manually..."
- enable_mmp $MMP_OSS $MMP_OSTDEV || \
- error "failed to enable MMP on $MMP_OSTDEV on $MMP_OSS"
- fi
-
- # check whether the MMP feature is enabled or not
- mmp_is_enabled $MMP_MDS $MMP_MDSDEV || \
- error "MMP was not enabled on $MMP_MDSDEV on $MMP_MDS"
-
- mmp_is_enabled $MMP_OSS $MMP_OSTDEV || \
- error "MMP was not enabled on $MMP_OSTDEV on $MMP_OSS"
+ mmp_is_enabled $MMP_MDS $MMP_MDSDEV ||
+ {
+ log "MMP is not enabled on MDS, enabling it manually..."
+ enable_mmp $MMP_MDS $MMP_MDSDEV ||
+ error "failed to enable MMP on $MMP_MDSDEV on $MMP_MDS"
+ I_ENABLED_MDS=1
+ }
+
+ mmp_is_enabled $MMP_OSS $MMP_OSTDEV ||
+ {
+ log "MMP is not enabled on OSS, enabling it manually..."
+ enable_mmp $MMP_OSS $MMP_OSTDEV ||
+ error "failed to enable MMP on $MMP_OSTDEV on $MMP_OSS"
+ I_ENABLED_OSS=1
+ }
+
+ # check whether the MMP feature is enabled or not
+ mmp_is_enabled $MMP_MDS $MMP_MDSDEV ||
+ error "MMP was not enabled on $MMP_MDSDEV on $MMP_MDS"
+
+ mmp_is_enabled $MMP_OSS $MMP_OSTDEV ||
+ error "MMP was not enabled on $MMP_OSTDEV on $MMP_OSS"
}
# Disable the MMP feature on the Lustre server targets
-# which did not use failover.
mmp_fini() {
- local var=${MMP_MDS}failover_HOST
- if [ -z "${!var}" ]; then
- log "Failover is not used on MDS, disabling MMP manually..."
- disable_mmp $MMP_MDS $MMP_MDSDEV || \
- error "failed to disable MMP on $MMP_MDSDEV on $MMP_MDS"
- mmp_is_enabled $MMP_MDS $MMP_MDSDEV && \
- error "MMP was not disabled on $MMP_MDSDEV on $MMP_MDS"
- fi
+ if [ $I_ENABLED_MDS -eq 1 ]; then
+ log "Disabling MMP on $MMP_MDSDEV on $MMP_MDS manually..."
+ disable_mmp $MMP_MDS $MMP_MDSDEV ||
+ error "failed to disable MMP on $MMP_MDSDEV on $MMP_MDS"
+ mmp_is_enabled $MMP_MDS $MMP_MDSDEV &&
+ error "MMP was not disabled on $MMP_MDSDEV on $MMP_MDS"
+ fi
- var=${MMP_OSS}failover_HOST
- if [ -z "${!var}" ]; then
- log "Failover is not used on OSS, disabling MMP manually..."
- disable_mmp $MMP_OSS $MMP_OSTDEV || \
- error "failed to disable MMP on $MMP_OSTDEV on $MMP_OSS"
- mmp_is_enabled $MMP_OSS $MMP_OSTDEV && \
- error "MMP was not disabled on $MMP_OSTDEV on $MMP_OSS"
- fi
+ if [ $I_ENABLED_OSS -eq 1 ]; then
+ log "Disabling MMP on $MMP_OSTDEV on $MMP_OSS manually..."
+ disable_mmp $MMP_OSS $MMP_OSTDEV ||
+ error "failed to disable MMP on $MMP_OSTDEV on $MMP_OSS"
+ mmp_is_enabled $MMP_OSS $MMP_OSTDEV &&
+ error "MMP was not disabled on $MMP_OSTDEV on $MMP_OSS"
+ fi
- return 0
+ return 0
}
# Mount the shared target on the failover server after some interval it's
# Run e2fsck on the Lustre server target.
run_e2fsck() {
- local facet=$1
- shift
- local device=$1
- shift
- local opts="$@"
-
- log "Running e2fsck on the device $device on $facet..."
- do_facet $facet "$E2FSCK $opts $device"
- return ${PIPESTATUS[0]}
-}
-
-# Run delayed e2fsck on the Lustre server target.
-run_delay_e2fsck() {
local facet=$1
shift
local device=$1
+ shift
+ local opts="$@"
- do_facet $facet "$LUSTRE/tests/e2fsck.exp $device"
+ echo "Running e2fsck on the device $device on $facet..."
+ do_facet $facet "$E2FSCK $opts $device"
return ${PIPESTATUS[0]}
}
# Test 8 - mount during e2fsck (should never succeed).
test_8() {
local e2fsck_pid
+ local saved_interval
+ local new_interval
+
+ # After writing a new sequence number into the MMP block, e2fsck will
+ # sleep at least (2 * new_interval + 1) seconds before it goes into
+ # e2fsck passes.
+ new_interval=30
- log "Force e2fsck checking on device $MMP_MDSDEV on $MMP_MDS"
- do_facet $MMP_MDS "$DEBUGFS -w -R 'ssv free_blocks_count 0' $MMP_MDSDEV"
- run_delay_e2fsck $MMP_MDS $MMP_MDSDEV &
+ # MDT
+ saved_interval=$(get_mmp_update_interval $MMP_MDS $MMP_MDSDEV)
+ set_mmp_update_interval $MMP_MDS $MMP_MDSDEV $new_interval
+
+ run_e2fsck $MMP_MDS $MMP_MDSDEV "-fy" &
e2fsck_pid=$!
sleep 5
error_noexit \
"mount $MMP_MDSDEV on $MMP_MDS_FAILOVER should fail"
stop $MMP_MDS_FAILOVER || return ${PIPESTATUS[0]}
+ set_mmp_update_interval $MMP_MDS $MMP_MDSDEV $saved_interval
return 1
fi
wait $e2fsck_pid
+ set_mmp_update_interval $MMP_MDS $MMP_MDSDEV $saved_interval
+ # OST
echo
- log "Force e2fsck checking on device $MMP_OSTDEV on $MMP_OSS"
- do_facet $MMP_OSS "$DEBUGFS -w -R 'ssv free_blocks_count 0' $MMP_OSTDEV"
- run_delay_e2fsck $MMP_OSS $MMP_OSTDEV &
+ saved_interval=$(get_mmp_update_interval $MMP_OSS $MMP_OSTDEV)
+ set_mmp_update_interval $MMP_OSS $MMP_OSTDEV $new_interval
+
+ run_e2fsck $MMP_OSS $MMP_OSTDEV "-fy" &
e2fsck_pid=$!
sleep 5
error_noexit \
"mount $MMP_OSTDEV on $MMP_OSS_FAILOVER should fail"
stop $MMP_OSS_FAILOVER || return ${PIPESTATUS[0]}
+ set_mmp_update_interval $MMP_OSS $MMP_OSTDEV $saved_interval
return 2
fi
wait $e2fsck_pid
+ set_mmp_update_interval $MMP_OSS $MMP_OSTDEV $saved_interval
return 0
}
run_test 8 "mount during e2fsck"
mmp_fini
FAIL_ON_ERROR=$SAVED_FAIL_ON_ERROR
-complete $(basename $0) $SECONDS
+complete $SECONDS
$MMP_RESTORE_MOUNT && setupall
exit_status