1e0f1c0afSOlaf Faaland#!/bin/ksh -p
2e0f1c0afSOlaf Faaland#
3e0f1c0afSOlaf Faaland# CDDL HEADER START
4e0f1c0afSOlaf Faaland#
5e0f1c0afSOlaf Faaland# This file and its contents are supplied under the terms of the
6e0f1c0afSOlaf Faaland# Common Development and Distribution License ("CDDL"), version 1.0.
7e0f1c0afSOlaf Faaland# You may only use this file in accordance with the terms of version
8e0f1c0afSOlaf Faaland# 1.0 of the CDDL.
9e0f1c0afSOlaf Faaland#
10e0f1c0afSOlaf Faaland# A full copy of the text of the CDDL should have accompanied this
11e0f1c0afSOlaf Faaland# source.  A copy of the CDDL is also available via the Internet at
12e0f1c0afSOlaf Faaland# http://www.illumos.org/license/CDDL.
13e0f1c0afSOlaf Faaland#
14e0f1c0afSOlaf Faaland# CDDL HEADER END
15e0f1c0afSOlaf Faaland#
16e0f1c0afSOlaf Faaland
17e0f1c0afSOlaf Faaland#
18e0f1c0afSOlaf Faaland# Copyright (c) 2017 by Lawrence Livermore National Security, LLC.
194348eb90SOlaf Faaland# Copyright 2019 Joyent, Inc.
20e0f1c0afSOlaf Faaland#
21e0f1c0afSOlaf Faaland
22e0f1c0afSOlaf Faaland# DESCRIPTION:
23e0f1c0afSOlaf Faaland#	Ensure that the MMP thread is notified when zfs_multihost_interval is
244348eb90SOlaf Faaland#	reduced, and that changes to zfs_multihost_interval and
254348eb90SOlaf Faaland#	zfs_multihost_fail_intervals do not trigger pool suspensions.
26e0f1c0afSOlaf Faaland#
27e0f1c0afSOlaf Faaland# STRATEGY:
28e0f1c0afSOlaf Faaland#	1. Set zfs_multihost_interval to much longer than the test duration
29e0f1c0afSOlaf Faaland#	2. Create a zpool and enable multihost
30e0f1c0afSOlaf Faaland#	3. Verify no MMP writes occurred
31e0f1c0afSOlaf Faaland#	4. Set zfs_multihost_interval to 1 second
32e0f1c0afSOlaf Faaland#	5. Sleep briefly
33e0f1c0afSOlaf Faaland#	6. Verify MMP writes began
344348eb90SOlaf Faaland#	7. Verify mmp_fail and mmp_write in uberblock reflect tunables
354348eb90SOlaf Faaland#	8. Repeatedly change tunables relating to pool suspension
36e0f1c0afSOlaf Faaland#
37e0f1c0afSOlaf Faaland
38e0f1c0afSOlaf Faaland. $STF_SUITE/include/libtest.shlib
39e0f1c0afSOlaf Faaland. $STF_SUITE/tests/functional/mmp/mmp.cfg
40e0f1c0afSOlaf Faaland. $STF_SUITE/tests/functional/mmp/mmp.kshlib
41e0f1c0afSOlaf Faaland
42e0f1c0afSOlaf Faalandverify_runnable "both"
43e0f1c0afSOlaf Faaland
44e0f1c0afSOlaf Faalandfunction cleanup
45e0f1c0afSOlaf Faaland{
46e0f1c0afSOlaf Faaland	default_cleanup_noexit
47e0f1c0afSOlaf Faaland	log_must set_tunable64 zfs_multihost_interval $MMP_INTERVAL_DEFAULT
484348eb90SOlaf Faaland	log_must set_tunable32 zfs_multihost_fail_intervals \
494348eb90SOlaf Faaland	    $MMP_FAIL_INTERVALS_DEFAULT
50e0f1c0afSOlaf Faaland	log_must mmp_clear_hostid
51e0f1c0afSOlaf Faaland}
52e0f1c0afSOlaf Faaland
53e0f1c0afSOlaf Faalandlog_assert "mmp threads notified when zfs_multihost_interval reduced"
54e0f1c0afSOlaf Faalandlog_onexit cleanup
55e0f1c0afSOlaf Faaland
56e0f1c0afSOlaf Faalandlog_must set_tunable64 zfs_multihost_interval $MMP_INTERVAL_HOUR
57e0f1c0afSOlaf Faalandlog_must mmp_set_hostid $HOSTID1
58e0f1c0afSOlaf Faaland
59e0f1c0afSOlaf Faalanddefault_setup_noexit $DISK
60e0f1c0afSOlaf Faalandlog_must zpool set multihost=on $TESTPOOL
61e0f1c0afSOlaf Faaland
62e0f1c0afSOlaf Faalandclear_mmp_history
63e0f1c0afSOlaf Faalandlog_must set_tunable64 zfs_multihost_interval $MMP_INTERVAL_DEFAULT
64e0f1c0afSOlaf Faalanduber_count=$(count_mmp_writes $TESTPOOL 1)
65e0f1c0afSOlaf Faaland
66e0f1c0afSOlaf Faalandif [ $uber_count -eq 0 ]; then
674348eb90SOlaf Faaland	log_fail "ERROR: mmp writes did not start when zfs_multihost_interval reduced"
68e0f1c0afSOlaf Faalandfi
69e0f1c0afSOlaf Faaland
704348eb90SOlaf Faaland# 7. Verify mmp_write and mmp_fail are written
714348eb90SOlaf Faalandfor fails in $(seq $MMP_FAIL_INTERVALS_MIN $((MMP_FAIL_INTERVALS_MIN*2))); do
724348eb90SOlaf Faaland	for interval in $(seq $MMP_INTERVAL_MIN 200 $MMP_INTERVAL_DEFAULT); do
734348eb90SOlaf Faaland		log_must set_tunable32 zfs_multihost_fail_intervals $fails
744348eb90SOlaf Faaland		log_must set_tunable64 zfs_multihost_interval $interval
75*09fbbb7dSAllan Jude		sync_pool $TESTPOOL true
764348eb90SOlaf Faaland		typeset mmp_fail=$(zdb $TESTPOOL 2>/dev/null |
774348eb90SOlaf Faaland		    awk '/mmp_fail/ {print $NF}')
784348eb90SOlaf Faaland		if [ $fails -ne $mmp_fail ]; then
794348eb90SOlaf Faaland			log_fail "ERROR: mmp_fail $mmp_fail != $fails"
804348eb90SOlaf Faaland		fi
814348eb90SOlaf Faaland		typeset mmp_write=$(zdb $TESTPOOL 2>/dev/null |
824348eb90SOlaf Faaland		    awk '/mmp_write/ {print $NF}')
834348eb90SOlaf Faaland		if [ $interval -ne $mmp_write ]; then
844348eb90SOlaf Faaland			log_fail "ERROR: mmp_write $mmp_write != $interval"
854348eb90SOlaf Faaland		fi
864348eb90SOlaf Faaland	done
874348eb90SOlaf Faalanddone
884348eb90SOlaf Faaland
894348eb90SOlaf Faaland
904348eb90SOlaf Faaland# 8. Repeatedly change zfs_multihost_interval and fail_intervals
914348eb90SOlaf Faalandfor x in $(seq 10); do
924348eb90SOlaf Faaland	typeset new_interval=$(( (RANDOM % 20 + 1) * $MMP_INTERVAL_MIN ))
934348eb90SOlaf Faaland	log_must set_tunable64 zfs_multihost_interval $new_interval
944348eb90SOlaf Faaland	typeset action=$((RANDOM %10))
954348eb90SOlaf Faaland	if [ $action -eq 0 ]; then
964348eb90SOlaf Faaland		if is_linux; then
974348eb90SOlaf Faaland			log_must zpool export -a
984348eb90SOlaf Faaland			log_must mmp_clear_hostid
994348eb90SOlaf Faaland			log_must mmp_set_hostid $HOSTID1
1004348eb90SOlaf Faaland			log_must zpool import $TESTPOOL
1014348eb90SOlaf Faaland		fi
1024348eb90SOlaf Faaland	elif [ $action -eq 1 ]; then
1034348eb90SOlaf Faaland		log_must zpool export -F $TESTPOOL
1044348eb90SOlaf Faaland		log_must zpool import $TESTPOOL
1054348eb90SOlaf Faaland	elif [ $action -eq 2 ]; then
1064348eb90SOlaf Faaland		log_must zpool export -F $TESTPOOL
1074348eb90SOlaf Faaland		log_must mmp_clear_hostid
1084348eb90SOlaf Faaland		log_must mmp_set_hostid $HOSTID2
1094348eb90SOlaf Faaland		log_must zpool import -f $TESTPOOL
1104348eb90SOlaf Faaland	elif [ $action -eq 3 ]; then
1114348eb90SOlaf Faaland		log_must zpool export -F $TESTPOOL
1124348eb90SOlaf Faaland		log_must set_tunable64 zfs_multihost_interval $MMP_INTERVAL_MIN
1134348eb90SOlaf Faaland		log_must zpool import $TESTPOOL
1144348eb90SOlaf Faaland	elif [ $action -eq 4 ]; then
1154348eb90SOlaf Faaland		log_must set_tunable32 zfs_multihost_fail_intervals \
1164348eb90SOlaf Faaland		    $((RANDOM % MMP_FAIL_INTERVALS_DEFAULT))
1174348eb90SOlaf Faaland	fi
1184348eb90SOlaf Faaland	sleep 5
1194348eb90SOlaf Faalanddone
1204348eb90SOlaf Faaland
1214348eb90SOlaf Faaland
122e0f1c0afSOlaf Faalandlog_pass "mmp threads notified when zfs_multihost_interval reduced"
123