ZTS: Improve enospc tests
The enospc_002_pos test case would frequently fail due a command succeeding when it was expected to fail due to lack of space. In order to make this far less likely, files are created across multiple transaction groups in order to consume as many unused blocks as possible. The dependency that the tests run on a partitioned block device has been removed. It's simpler to use sparse files. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #7663
This commit is contained in:
parent
da2feb42fb
commit
e03a41a604
|
@ -105,6 +105,14 @@ user_ns_reason = 'Kernel user namespace support required'
|
||||||
#
|
#
|
||||||
rewind_reason = 'Arbitrary pool rewind is not guaranteed'
|
rewind_reason = 'Arbitrary pool rewind is not guaranteed'
|
||||||
|
|
||||||
|
#
|
||||||
|
# Some tests may by structured in a way that relies on exact knowledge
|
||||||
|
# of how much free space in available in a pool. These tests cannot be
|
||||||
|
# made completely reliable because the internal details of how free space
|
||||||
|
# is managed are not exposed to user space.
|
||||||
|
#
|
||||||
|
enospc_reason = 'Exact free space reporting is not guaranteed'
|
||||||
|
|
||||||
#
|
#
|
||||||
# Some tests are not applicable to Linux or need to be updated to operate
|
# Some tests are not applicable to Linux or need to be updated to operate
|
||||||
# in the manor required by Linux. Any tests which are skipped for this
|
# in the manor required by Linux. Any tests which are skipped for this
|
||||||
|
@ -235,8 +243,7 @@ maybe = {
|
||||||
'inuse/inuse_009_pos': ['SKIP', disk_reason],
|
'inuse/inuse_009_pos': ['SKIP', disk_reason],
|
||||||
'largest_pool/largest_pool_001_pos': ['FAIL', known_reason],
|
'largest_pool/largest_pool_001_pos': ['FAIL', known_reason],
|
||||||
'pyzfs/pyzfs_unittest': ['SKIP', python_deps_reason],
|
'pyzfs/pyzfs_unittest': ['SKIP', python_deps_reason],
|
||||||
'no_space/setup': ['SKIP', disk_reason],
|
'no_space/enospc_002_pos': ['FAIL', enospc_reason],
|
||||||
'no_space/enospc_002_pos': ['FAIL', known_reason],
|
|
||||||
'projectquota/setup': ['SKIP', exec_reason],
|
'projectquota/setup': ['SKIP', exec_reason],
|
||||||
'reservation/reservation_018_pos': ['FAIL', '5642'],
|
'reservation/reservation_018_pos': ['FAIL', '5642'],
|
||||||
'rsend/rsend_019_pos': ['FAIL', '6086'],
|
'rsend/rsend_019_pos': ['FAIL', '6086'],
|
||||||
|
|
|
@ -33,22 +33,7 @@
|
||||||
|
|
||||||
verify_runnable "global"
|
verify_runnable "global"
|
||||||
|
|
||||||
DISK=${DISKS%% *}
|
default_cleanup_noexit
|
||||||
|
log_must rm -f $DISK_SMALL $DISK_LARGE
|
||||||
ismounted "$TESTPOOL/$TESTFS"
|
|
||||||
(( $? == 0 )) && \
|
|
||||||
log_must zfs umount $TESTDIR
|
|
||||||
|
|
||||||
destroy_pool $TESTPOOL
|
|
||||||
|
|
||||||
if is_mpath_device $DISK; then
|
|
||||||
delete_partitions
|
|
||||||
fi
|
|
||||||
|
|
||||||
#
|
|
||||||
# Remove 100mb partition.
|
|
||||||
#
|
|
||||||
create_pool dummy$$ "$DISK"
|
|
||||||
destroy_pool dummy$$
|
|
||||||
|
|
||||||
log_pass
|
log_pass
|
||||||
|
|
|
@ -28,15 +28,12 @@
|
||||||
# Copyright (c) 2013 by Delphix. All rights reserved.
|
# Copyright (c) 2013 by Delphix. All rights reserved.
|
||||||
#
|
#
|
||||||
|
|
||||||
export TESTFILE0=testfile0.$$
|
DISK_SMALL=${TEST_BASE_DIR%%/}/vdev_small
|
||||||
export TESTFILE1=testfile1.$$
|
DISK_LARGE=${TEST_BASE_DIR%%/}/vdev_large
|
||||||
|
|
||||||
export SIZE=100mb
|
export SIZE_SMALL=100m
|
||||||
|
export SIZE_LARGE=512m
|
||||||
export ENOSPC=28
|
export ENOSPC=28
|
||||||
export BLOCKSZ=8192
|
export BLOCKSZ=8192
|
||||||
export NUM_WRITES=65536
|
export NUM_WRITES=65536
|
||||||
export DATA=0
|
export DATA=0
|
||||||
|
|
||||||
export DISKSARRAY=$DISKS
|
|
||||||
export DISK_ARRAY_NUM=$(echo ${DISKS} | nawk '{print NF}')
|
|
||||||
set_device_dir
|
|
||||||
|
|
|
@ -48,13 +48,14 @@ verify_runnable "both"
|
||||||
|
|
||||||
function cleanup
|
function cleanup
|
||||||
{
|
{
|
||||||
rm -f $TESTDIR/$TESTFILE0
|
default_cleanup_noexit
|
||||||
rm -f $TESTDIR/$TESTFILE1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
log_onexit cleanup
|
log_onexit cleanup
|
||||||
|
|
||||||
log_assert "ENOSPC is returned when file system is full."
|
log_assert "ENOSPC is returned when file system is full."
|
||||||
|
|
||||||
|
default_setup_noexit $DISK_SMALL
|
||||||
log_must zfs set compression=off $TESTPOOL/$TESTFS
|
log_must zfs set compression=off $TESTPOOL/$TESTFS
|
||||||
|
|
||||||
log_note "Writing file: $TESTFILE0 until ENOSPC."
|
log_note "Writing file: $TESTFILE0 until ENOSPC."
|
||||||
|
|
|
@ -28,18 +28,36 @@
|
||||||
|
|
||||||
verify_runnable "both"
|
verify_runnable "both"
|
||||||
|
|
||||||
|
function cleanup
|
||||||
|
{
|
||||||
|
log_must_busy zpool destroy -f $TESTPOOL
|
||||||
|
}
|
||||||
|
|
||||||
|
log_onexit cleanup
|
||||||
|
|
||||||
log_assert "ENOSPC is returned when file system is full."
|
log_assert "ENOSPC is returned when file system is full."
|
||||||
sync
|
|
||||||
|
default_setup_noexit $DISK_SMALL
|
||||||
log_must zfs set compression=off $TESTPOOL/$TESTFS
|
log_must zfs set compression=off $TESTPOOL/$TESTFS
|
||||||
log_must zfs snapshot $TESTPOOL/$TESTFS@snap
|
log_must zfs snapshot $TESTPOOL/$TESTFS@snap
|
||||||
|
|
||||||
log_note "Writing file: $TESTFILE0 until ENOSPC."
|
#
|
||||||
file_write -o create -f $TESTDIR/$TESTFILE0 -b $BLOCKSZ \
|
# Completely fill the pool in order to ensure the commands below will more
|
||||||
|
# reliably succeed or fail as a result of lack of space. Care is taken to
|
||||||
|
# force multiple transaction groups to ensure as many recently freed blocks
|
||||||
|
# as possible are reallocated.
|
||||||
|
#
|
||||||
|
log_note "Writing files until ENOSPC."
|
||||||
|
|
||||||
|
for i in $(seq 30); do
|
||||||
|
file_write -o create -f $TESTDIR/file.$i -b $BLOCKSZ \
|
||||||
-c $NUM_WRITES -d $DATA
|
-c $NUM_WRITES -d $DATA
|
||||||
ret=$?
|
ret=$?
|
||||||
|
|
||||||
(( $ret != $ENOSPC )) && \
|
(( $ret != $ENOSPC )) && \
|
||||||
log_fail "$TESTFILE0 returned: $ret rather than ENOSPC."
|
log_fail "file.$i returned: $ret rather than ENOSPC."
|
||||||
|
|
||||||
|
log_must zpool sync -f
|
||||||
|
done
|
||||||
|
|
||||||
log_mustnot_expect space zfs create $TESTPOOL/$TESTFS/subfs
|
log_mustnot_expect space zfs create $TESTPOOL/$TESTFS/subfs
|
||||||
log_mustnot_expect space zfs clone $TESTPOOL/$TESTFS@snap $TESTPOOL/clone
|
log_mustnot_expect space zfs clone $TESTPOOL/$TESTFS@snap $TESTPOOL/clone
|
||||||
|
|
|
@ -45,19 +45,13 @@ verify_runnable "both"
|
||||||
function cleanup
|
function cleanup
|
||||||
{
|
{
|
||||||
log_must zpool destroy $TESTPOOL1
|
log_must zpool destroy $TESTPOOL1
|
||||||
log_must rm -f $disk
|
|
||||||
}
|
}
|
||||||
|
|
||||||
log_onexit cleanup
|
log_onexit cleanup
|
||||||
|
|
||||||
log_assert "ENOSPC is returned on pools with large physical block size"
|
log_assert "ENOSPC is returned on pools with large physical block size"
|
||||||
|
|
||||||
disk=$TEST_BASE_DIR/$FILEDISK0
|
log_must zpool create $TESTPOOL1 -o ashift=13 $DISK_LARGE
|
||||||
# we need a device big enough to test this or failure will not trigger
|
|
||||||
size="512m"
|
|
||||||
log_must mkfile $size $disk
|
|
||||||
|
|
||||||
log_must zpool create $TESTPOOL1 -o ashift=13 $disk
|
|
||||||
log_must zfs set mountpoint=$TESTDIR $TESTPOOL1
|
log_must zfs set mountpoint=$TESTDIR $TESTPOOL1
|
||||||
log_must zfs set compression=off $TESTPOOL1
|
log_must zfs set compression=off $TESTPOOL1
|
||||||
log_must zfs set recordsize=512 $TESTPOOL1
|
log_must zfs set recordsize=512 $TESTPOOL1
|
||||||
|
|
|
@ -34,23 +34,7 @@
|
||||||
|
|
||||||
verify_runnable "global"
|
verify_runnable "global"
|
||||||
|
|
||||||
if ! $(is_physical_device $DISKS) ; then
|
log_must truncate -s $SIZE_SMALL $DISK_SMALL
|
||||||
log_unsupported "This directory cannot be run on raw files."
|
log_must truncate -s $SIZE_LARGE $DISK_LARGE
|
||||||
fi
|
|
||||||
|
|
||||||
DISK=${DISKS%% *}
|
log_pass
|
||||||
|
|
||||||
log_must set_partition 0 "" $SIZE $DISK
|
|
||||||
|
|
||||||
if is_linux; then
|
|
||||||
if ( is_mpath_device $DISK ) && [[ -z $(echo $DISK | awk 'substr($1,18,1)\
|
|
||||||
~ /^[[:digit:]]+$/') ]] || ( is_real_device $DISK ); then
|
|
||||||
default_setup $DISK"1"
|
|
||||||
elif ( is_mpath_device $DISK || is_loop_device $DISK ); then
|
|
||||||
default_setup $DISK"p1"
|
|
||||||
else
|
|
||||||
log_fail "$DISK not supported for partitioning."
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
default_setup $DISK"s0"
|
|
||||||
fi
|
|
||||||
|
|
Loading…
Reference in New Issue