svn commit: r292297 - projects/zfsd/head/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy
Alan Somers
asomers at FreeBSD.org
Wed Dec 16 00:00:59 UTC 2015
Author: asomers
Date: Wed Dec 16 00:00:57 2015
New Revision: 292297
URL: https://svnweb.freebsd.org/changeset/base/292297
Log:
Add zpool_destroy_004_pos test case.
This test targets the ability of 'zpool destroy -f' to tear down the pool
even if there is activity on it. In particular, this tests a background zfs
send | zfs receive.
zpool_destroy_004_pos tests the following combinations:
- Data size of 1GB: sleep times 0.1 0.3 0.5 0.75 1 2 3
The goal is to test the race conditions at various points during the
process of 'zfs send' and 'zfs receive', with respect to when the 'zpool
destroy -f' takes place.
- Data size of 4/3 physical memory: sleep time 15
The goal is to validate that the destroy process teardown time is
orthagonal to the send stream size.
Each test point above looks like this:
for sleeptime in <sleep times>; do
Run the tests where the sender and receiver are the same pool
Run the tests where they differ; destroy the sender
Run the tests where they differ; destroy the receiver
done
The tests in each step above perform the following:
- Create the sender pool (and receiver pool if applicable)
- Create a dataset on the sender, populate it, then snapshot it
- Start the send | receive in the background
- Sleep $sleeptime seconds
- Do the forced destroy of the target pool, must succeed
- Wait for the background subshell to exit non-zero
- Verify that the target pool is indeed no longer visible
Submitted by: Will
Sponsored by: Spectra Logic Corp
Added:
projects/zfsd/head/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_004_pos.ksh
Modified:
projects/zfsd/head/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/Makefile
projects/zfsd/head/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_test.sh
Modified: projects/zfsd/head/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/Makefile
==============================================================================
--- projects/zfsd/head/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/Makefile Tue Dec 15 23:56:57 2015 (r292296)
+++ projects/zfsd/head/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/Makefile Wed Dec 16 00:00:57 2015 (r292297)
@@ -13,5 +13,6 @@ FILES+= zpool_destroy.cfg
FILES+= zpool_destroy_001_pos.ksh
FILES+= zpool_destroy_002_pos.ksh
FILES+= zpool_destroy_003_neg.ksh
+FILES+= zpool_destroy_004_pos.ksh
.include <bsd.test.mk>
Added: projects/zfsd/head/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_004_pos.ksh
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ projects/zfsd/head/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_004_pos.ksh Wed Dec 16 00:00:57 2015 (r292297)
@@ -0,0 +1,119 @@
+#!/usr/local/bin/ksh93 -p
+#
+# Copyright 2015 Spectra Logic Corporation.
+#
+
+. $STF_SUITE/include/libtest.kshlib
+
+################################################################################
+#
+# __stc_assertion_start
+#
+# ID: zpool_destroy_004_pos
+#
+# DESCRIPTION:
+# 'zpool destroy -f <pool>' can forcibly destroy the specified pool,
+# even if that pool has running zfs send or receive activity.
+#
+# STRATEGY:
+# 1. Create a storage pool
+# 2. For each sleep time in a set:
+# 2a. For each destroy type (same pool, sender only, receiver only):
+# - Create a dataset with some amount of data
+# - Run zfs send | zfs receive in the background.
+# - Sleep the amount of time specified for this run.
+# - 'zpool destroy -f' the pool.
+# - Wait for the send|receive to exit. It must not be killed in
+# order to ensure that the destroy takes care of doing so.
+# - Verify the pool destroyed successfully
+#
+# __stc_assertion_end
+#
+###############################################################################
+
+verify_runnable "global"
+
+function cleanup
+{
+ poolexists $TESTPOOL && destroy_pool $TESTPOOL
+ poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1
+}
+
+function create_sender
+{
+ cleanup
+ create_pool "$TESTPOOL" "$DISK0"
+ log_must $ZFS create $TESTPOOL/$TESTFS
+ log_must $MKDIR -p $TESTDIR
+ log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS
+ log_must dd if=/dev/zero of=$TESTDIR/f0 bs=1024k count=$datasz
+ log_must $ZFS snapshot $TESTPOOL/$TESTFS at snap1
+}
+
+function create_sender_and_receiver
+{
+ create_sender
+ create_pool "$TESTPOOL1" "$DISK1"
+}
+
+function send_recv_destroy
+{
+ sleeptime=$1
+ recv=$2
+ to_destroy=$3
+
+ ( $ZFS send -RP $TESTPOOL/$TESTFS at s0 | $ZFS receive -Fu $recv/d1 ) &
+ sendrecvpid=$!
+
+ log_must sleep $sleeptime
+ destroy_start=$(date '+%s')
+ log_must $ZPOOL destroy -f $to_destroy
+ destroy_end=$(date '+%s')
+ dtime=$(expr ${destroy_end} - ${destroy_start})
+ log_note "Destroy took ${dtime} seconds."
+
+ log_note "If this wait returns 0, it means send or receive succeeded."
+ log_mustnot wait $sendrecvpid
+ wait_end=$(date '+%s')
+ wtime=$(expr ${wait_end} - ${destroy_end})
+ log_note "send|receive took ${wtime} seconds to finish."
+
+ log_mustnot $ZPOOL list $to_destroy
+}
+
+function run_tests
+{
+ log_note "TEST: send|receive to the same pool"
+ create_sender
+ send_recv_destroy $sleeptime $TESTPOOL $TESTPOOL
+
+ log_note "TEST: send|receive to different pools, destroy sender"
+ create_sender_and_receiver
+ send_recv_destroy $sleeptime $TESTPOOL1 $TESTPOOL
+
+ log_note "TEST: send|receive to different pools, destroy receiver"
+ create_sender_and_receiver
+ send_recv_destroy $sleeptime $TESTPOOL1 $TESTPOOL1
+}
+
+log_assert "'zpool destroy -f <pool>' can force destroy active pool"
+log_onexit cleanup
+set_disks
+
+# Faster tests using 1GB data size
+datasz=1000
+log_note "Running fast tests with 1000MB of data"
+for sleeptime in 0.1 0.3 0.5 0.75 1 2 3; do
+ run_tests
+done
+
+# A longer test that simulates a more realistic send|receive that exceeds
+# the size of physical memory by 1/3 and gets interrupted a decent amount of
+# time after the start of the run.
+physmem=$(sysctl -n hw.physmem)
+datasz=$(expr ${physmem} / 1048576 \* 4 / 3)
+log_note "Running longer test with ${datasz}MB of data"
+sleeptime=15
+run_tests
+
+log_pass "'zpool destroy -f <pool>' successful with active pools."
Modified: projects/zfsd/head/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_test.sh
==============================================================================
--- projects/zfsd/head/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_test.sh Tue Dec 15 23:56:57 2015 (r292296)
+++ projects/zfsd/head/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_test.sh Wed Dec 16 00:00:57 2015 (r292297)
@@ -98,10 +98,37 @@ zpool_destroy_003_neg_cleanup()
}
+atf_test_case zpool_destroy_004_pos cleanup
+zpool_destroy_004_pos_head()
+{
+ atf_set "descr" "'zpool destroy -f' should work on active pools."
+ atf_set "require.progs" zfs zpool
+ atf_set "require.config" at_least_2_disks
+ atf_set "timeout" 2000
+}
+zpool_destroy_004_pos_body()
+{
+ export TESTCASE_ID=$(echo $(atf_get ident) | cksum -o 2 | cut -f 1 -d " ")
+ . $(atf_get_srcdir)/../../../include/default.cfg
+ . $(atf_get_srcdir)/zpool_destroy.cfg
+
+ ksh93 $(atf_get_srcdir)/zpool_destroy_004_pos.ksh || atf_fail "Testcase failed"
+}
+zpool_destroy_004_pos_cleanup()
+{
+ export TESTCASE_ID=$(echo $(atf_get ident) | cksum -o 2 | cut -f 1 -d " ")
+ . $(atf_get_srcdir)/../../../include/default.cfg
+ . $(atf_get_srcdir)/zpool_destroy.cfg
+
+ ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed"
+}
+
+
atf_init_test_cases()
{
atf_add_test_case zpool_destroy_001_pos
atf_add_test_case zpool_destroy_002_pos
atf_add_test_case zpool_destroy_003_neg
+ atf_add_test_case zpool_destroy_004_pos
}
More information about the svn-src-projects
mailing list