/tests/zfs-tests/tests/functional/removal/removal_resume_export.ksh
https://github.com/adilger/zfs · Korn Shell · 100 lines · 21 code · 16 blank · 63 comment · 0 complexity · 0744f443bc3869e3060982f27eb0d9f3 MD5 · raw file
- #! /bin/ksh -p
- #
- # CDDL HEADER START
- #
- # This file and its contents are supplied under the terms of the
- # Common Development and Distribution License ("CDDL"), version 1.0.
- # You may only use this file in accordance with the terms of version
- # 1.0 of the CDDL.
- #
- # A full copy of the text of the CDDL should have accompanied this
- # source. A copy of the CDDL is also available via the Internet at
- # http://www.illumos.org/license/CDDL.
- #
- # CDDL HEADER END
- #
- #
- # Copyright (c) 2017 by Delphix. All rights reserved.
- #
- . $STF_SUITE/include/libtest.shlib
- . $STF_SUITE/tests/functional/removal/removal.kshlib
- #
- # DESCRIPTION:
- #
- # When a pool has an ongoing removal and it is exported ZFS
- # suspends the removal thread beforehand. This test ensures
- # that ZFS restarts the removal thread if the export fails
- # for some reason.
- #
- # STRATEGY:
- #
- # 1. Create a pool with one vdev and do some writes on it.
- # 2. Add a new vdev to the pool and start the removal of
- # the first vdev.
- # 3. Inject a fault in the pool and attempt to export (it
- # should fail).
- # 4. After the export fails ensure that the removal thread
- # was restarted and the process complete successfully.
- #
- function cleanup
- {
- zinject -c all
- default_cleanup_noexit
- }
- function callback
- {
- #
- # Inject an error so export fails after having just suspended
- # the removal thread. [spa_inject_ref gets incremented]
- #
- log_must zinject -d $REMOVEDISK -D 10:1 $TESTPOOL
- #
- # Because of the above error export should fail.
- #
- log_mustnot zpool export $TESTPOOL
- #
- # Let the removal finish.
- #
- log_must zinject -c all
- return 0
- }
- log_onexit cleanup
- #
- # Create pool with one disk.
- #
- log_must default_setup_noexit "$REMOVEDISK"
- #
- # Turn off compression to raise capacity as much as possible
- # for the little time that this test runs.
- #
- log_must zfs set compression=off $TESTPOOL/$TESTFS
- #
- # Write some data that will be evacuated from the device when
- # we start the removal.
- #
- log_must dd if=/dev/urandom of=$TESTDIR/$TESTFILE0 bs=64M count=32
- #
- # Add second device where all the data will be evacuated.
- #
- log_must zpool add -f $TESTPOOL $NOTREMOVEDISK
- #
- # Attempt the export with errors injected.
- #
- log_must attempt_during_removal $TESTPOOL $REMOVEDISK callback
- log_pass "Device removal thread resumes after failed export"