From cdbc34fc2b954e504d42e25ad5c8e92504908813 Mon Sep 17 00:00:00 2001 From: Ryan Moeller Date: Thu, 12 Mar 2020 13:50:01 -0400 Subject: [PATCH] ZTS: Test boundary conditions in alloc_class_012 Issue #9142 describes an error in the checks for device removal that can prevent removal of special allocation class vdevs in some situations. Enhance alloc_class/alloc_class_012_pos to check situations where this bug occurs. Update zts-report with knowledge of issue #9142. Reviewed-by: Brian Behlendorf Signed-off-by: Ryan Moeller Closes #10116 Issue #9142 --- tests/test-runner/bin/zts-report.py | 2 + .../alloc_class/alloc_class_012_pos.ksh | 94 +++++++++++-------- 2 files changed, 57 insertions(+), 39 deletions(-) diff --git a/tests/test-runner/bin/zts-report.py b/tests/test-runner/bin/zts-report.py index c0140036fb5c..9f96d03ecdd7 100755 --- a/tests/test-runner/bin/zts-report.py +++ b/tests/test-runner/bin/zts-report.py @@ -178,6 +178,8 @@ # reasons listed above can be used. # maybe = { + 'alloc_class/alloc_class_012_pos': ['FAIL', '9142'], + 'alloc_class/alloc_class_013_pos': ['FAIL', '9142'], 'cache/cache_010_neg': ['FAIL', known_reason], 'casenorm/mixed_formd_lookup': ['FAIL', '7633'], 'casenorm/mixed_formd_delete': ['FAIL', '7633'], diff --git a/tests/zfs-tests/tests/functional/alloc_class/alloc_class_012_pos.ksh b/tests/zfs-tests/tests/functional/alloc_class/alloc_class_012_pos.ksh index 7ab6a0543b2d..1cfe6642d8a8 100755 --- a/tests/zfs-tests/tests/functional/alloc_class/alloc_class_012_pos.ksh +++ b/tests/zfs-tests/tests/functional/alloc_class/alloc_class_012_pos.ksh @@ -57,50 +57,66 @@ if (match($0,"L0 [0-9]+")) { }}' } +# +# Check that device removal works for special class vdevs +# +function check_removal +{ + # + # Create a non-raidz pool so we can remove top-level vdevs + # + log_must disk_setup + log_must zpool create $TESTPOOL $ZPOOL_DISKS \ + special $CLASS_DISK0 special $CLASS_DISK1 + log_must display_status "$TESTPOOL" + + # + # Generate some metadata and small blocks in the special class vdev + # before removal + # + typeset -l i=1 + typeset -l blocks=25 + + log_must zfs create -o special_small_blocks=32K -o recordsize=32K \ + $TESTPOOL/$TESTFS + for i in 1 2 3 4; do + log_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS/testfile.$i \ + bs=1M count=$blocks + ((blocks = blocks + 25)) + done + log_must sync_pool $TESTPOOL + log_must zpool list -v $TESTPOOL + + # Verify the files were written in the special class vdevs + for i in 1 2 3 4; do + dataset="$TESTPOOL/$TESTFS" + inum="$(get_objnum /$TESTPOOL/$TESTFS/testfile.$i)" + log_must file_in_special_vdev $dataset $inum + done + + log_must zpool remove $TESTPOOL $CLASS_DISK0 + + sleep 5 + log_must sync_pool $TESTPOOL + sleep 1 + + log_must zdb -bbcc $TESTPOOL + log_must zpool list -v $TESTPOOL + log_must zpool destroy -f "$TESTPOOL" + log_must disk_cleanup +} + claim="Removing a special device from a pool succeeds." log_assert $claim log_onexit cleanup -# -# Create a non-raidz pool so we can remove top-level vdevs -# -log_must disk_setup -log_must zpool create $TESTPOOL $ZPOOL_DISK0 $ZPOOL_DISK1 $ZPOOL_DISK2 \ - special $CLASS_DISK0 special $CLASS_DISK1 -log_must display_status "$TESTPOOL" - -# -# Generate some metadata and small blocks in the special class before removal -# -typeset -l i=1 -typeset -l blocks=25 - -log_must zfs create -o special_small_blocks=32K -o recordsize=32K \ - $TESTPOOL/$TESTFS -for i in 1 2 3 4; do - log_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS/testfile.$i bs=1M \ - count=$blocks - ((blocks = blocks + 25)) -done -log_must sync_pool $TESTPOOL -log_must zpool list -v $TESTPOOL - -# Verify the files were written in the special class vdevs -for i in 1 2 3 4; do - dataset="$TESTPOOL/$TESTFS" - inum="$(stat -c '%i' /$TESTPOOL/$TESTFS/testfile.$i)" - log_must file_in_special_vdev $dataset $inum +typeset CLASS_DEVSIZE=$CLASS_DEVSIZE +for CLASS_DEVSIZE in $CLASS_DEVSIZE $ZPOOL_DEVSIZE; do + typeset ZPOOL_DISKS=$ZPOOL_DISKS + for ZPOOL_DISKS in "$ZPOOL_DISKS" $ZPOOL_DISK0; do + check_removal + done done -log_must zpool remove $TESTPOOL $CLASS_DISK0 - -sleep 5 -log_must sync_pool $TESTPOOL -sleep 1 - -log_must zdb -bbcc $TESTPOOL -log_must zpool list -v $TESTPOOL -log_must zpool destroy -f "$TESTPOOL" - log_pass $claim