]> granicus.if.org Git - zfs/commitdiff
mmp_on_uberblocks: Use kstat for uberblock counts
authorGiuseppe Di Natale <dinatale2@users.noreply.github.com>
Mon, 31 Jul 2017 23:54:34 +0000 (16:54 -0700)
committerTony Hutter <hutter2@llnl.gov>
Wed, 2 Aug 2017 18:21:33 +0000 (11:21 -0700)
Use kstat to get a more accurate count of uberblock updates.
Using a loop with zdb can potentially miss some uberblocks.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Giuseppe Di Natale <dinatale2@llnl.gov>
Closes #6407
Closes #6419

tests/zfs-tests/tests/functional/mmp/mmp.kshlib
tests/zfs-tests/tests/functional/mmp/mmp_on_uberblocks.ksh
tests/zfs-tests/tests/functional/mmp/mmp_reset_interval.ksh
tests/zfs-tests/tests/functional/mmp/mmp_write_uberblocks.ksh

index ffe26dfde8200079e20a64702427f6b4db369b90..43e4f37119a36ae2cdac144a9a08502364224540 100644 (file)
@@ -182,3 +182,19 @@ function import_activity_check # pool opts
 
        return $rc
 }
+
+function clear_mmp_history
+{
+       log_must set_tunable64 zfs_multihost_history $MMP_HISTORY_OFF
+       log_must set_tunable64 zfs_multihost_history $MMP_HISTORY
+}
+
+function count_uberblocks # pool duration
+{
+       typeset pool=$1
+       typeset -i duration=$2
+       typeset hist_path="/proc/spl/kstat/zfs/$pool/multihost"
+
+       log_must sleep $duration
+       echo $(cat "$hist_path" | sed '1,2d' | wc -l)
+}
index 2e21e2feff42266cfe0f83459997b7c4d0f81775..df4ab888b4192454236af2f07892c640ec22111a 100755 (executable)
@@ -24,8 +24,8 @@
 # STRATEGY:
 #      1. Set zfs_txg_timeout to large value
 #      2. Create a zpool
-#      3. Find the current "best" uberblock
-#      4. Loop for 10 seconds, increment counter for each change in UB
+#      3. Clear multihost history
+#      4. Sleep, then collect count of uberblocks written
 #      5. If number of changes seen is less than min threshold, then fail
 #      6. If number of changes seen is more than max threshold, then fail
 #
 verify_runnable "both"
 
 UBER_CHANGES=0
+EXPECTED=$(($(echo $DISKS | wc -w) * 10))
+FUDGE=$((EXPECTED * 20 / 100))
+MIN=$((EXPECTED - FUDGE))
+MAX=$((EXPECTED + FUDGE))
 
 function cleanup
 {
        default_cleanup_noexit
        set_tunable64 zfs_txg_timeout $TXG_TIMEOUT_DEFAULT
-       log_must rm -f $PREV_UBER $CURR_UBER
        log_must mmp_clear_hostid
 }
 
@@ -52,28 +55,19 @@ log_onexit cleanup
 log_must set_tunable64 zfs_txg_timeout $TXG_TIMEOUT_LONG
 log_must mmp_set_hostid $HOSTID1
 
-default_setup_noexit $DISK
+default_setup_noexit "$DISKS"
 log_must zpool set multihost=on $TESTPOOL
-
-log_must zdb -u $TESTPOOL > $PREV_UBER
-
-SECONDS=0
-while [[ $SECONDS -le 10 ]]; do
-       log_must zdb -u $TESTPOOL > $CURR_UBER
-       if ! diff -u "$CURR_UBER" "$PREV_UBER"; then
-               (( UBER_CHANGES = UBER_CHANGES + 1 ))
-               log_must mv "$CURR_UBER" "$PREV_UBER"
-       fi
-done
+clear_mmp_history
+UBER_CHANGES=$(count_uberblocks $TESTPOOL 10)
 
 log_note "Uberblock changed $UBER_CHANGES times"
 
-if [[ $UBER_CHANGES -lt 8 ]]; then
-       log_fail "Fewer uberblock writes occured than expected (10)"
+if [ $UBER_CHANGES -lt $MIN ]; then
+       log_fail "Fewer uberblock writes occured than expected ($EXPECTED)"
 fi
 
-if [[ $UBER_CHANGES -gt 12 ]]; then
-       log_fail "More uberblock writes occured than expected (10)"
+if [ $UBER_CHANGES -gt $MAX ]; then
+       log_fail "More uberblock writes occured than expected ($EXPECTED)"
 fi
 
 log_pass "Ensure MMP uberblocks update at the correct interval passed"
index ee408a849434b91f8de27dbf1ab6f02966a67d5d..e98b162183b58ed12e2a13b1a29300d6d5a7d2a0 100755 (executable)
@@ -53,14 +53,11 @@ log_must mmp_set_hostid $HOSTID1
 default_setup_noexit $DISK
 log_must zpool set multihost=on $TESTPOOL
 
-prev_count=$(wc -l /proc/spl/kstat/zfs/$TESTPOOL/multihost | cut -f1 -d' ')
+clear_mmp_history
 log_must set_tunable64 zfs_multihost_interval $MMP_INTERVAL_DEFAULT
+uber_count=$(count_uberblocks $TESTPOOL 1)
 
-# slight delay to allow time for the mmp write to complete
-sleep 1
-curr_count=$(wc -l /proc/spl/kstat/zfs/$TESTPOOL/multihost | cut -f1 -d' ')
-
-if [ $curr_count -eq $prev_count ]; then
+if [ $uber_count -eq 0 ]; then
        log_fail "mmp writes did not start when zfs_multihost_interval reduced"
 fi
 
index 4a13dfa2c2740a84a86d8b5dbd4d39ccd6fc0410..71b5c391b83466d32180a8070d94b3bbdb1a263c 100755 (executable)
@@ -48,12 +48,10 @@ log_must mmp_set_hostid $HOSTID1
 default_mirror_setup_noexit $DISKS
 log_must zpool set multihost=on $TESTPOOL
 log_must zinject -d ${DISK[0]} -e io -T write -f 50 $TESTPOOL -L uber
+clear_mmp_history
+uber_count=$(count_uberblocks $TESTPOOL 3)
 
-prev_count=$(wc -l /proc/spl/kstat/zfs/$TESTPOOL/multihost | cut -f1 -d' ')
-log_must sleep 3
-curr_count=$(wc -l /proc/spl/kstat/zfs/$TESTPOOL/multihost | cut -f1 -d' ')
-
-if [ $curr_count -eq $prev_count ]; then
+if [ $uber_count -eq 0 ]; then
        log_fail "mmp writes did not occur when uberblock IO errors injected"
 fi