Retry zfs destroy when busy in rsend tests

rsend tests in the test suite frequently create and
destroy datasets. It is possible for zfs destroy to
return an error code indicating the dataset is busy.
Simply use a log_must_busy in these cases to retry
destroying those datasets. Other fixes to rsend test
cases to avoid unmounting and remounting filesystems
and some cleanup.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Giuseppe Di Natale <dinatale2@llnl.gov>
Closes #6418
This commit is contained in:
Giuseppe Di Natale 2017-08-03 08:57:43 -07:00 committed by Brian Behlendorf
parent ecb2b7dc7f
commit e3bdcb8ad8
16 changed files with 46 additions and 47 deletions

View File

@ -56,7 +56,7 @@ verify_runnable "both"
function cleanup { function cleanup {
for obj in $OBJ_LIST; do for obj in $OBJ_LIST; do
datasetexists $obj && log_must zfs destroy -f $obj datasetexists $obj && log_must_busy zfs destroy -f $obj
done done
} }
@ -112,7 +112,7 @@ for obj in $OBJ_LIST ; do
"($resv_size_set != $resv_size_get)" "($resv_size_set != $resv_size_get)"
fi fi
log_must zfs destroy -f $obj log_must_busy zfs destroy -f $obj
new_space_avail=`get_prop available $TESTPOOL` new_space_avail=`get_prop available $TESTPOOL`
new_space_used=`get_prop used $TESTPOOL` new_space_used=`get_prop used $TESTPOOL`

View File

@ -119,13 +119,13 @@ function cleanup_pool
log_must rm -rf $BACKDIR/* log_must rm -rf $BACKDIR/*
if is_global_zone ; then if is_global_zone ; then
log_must zfs destroy -Rf $pool log_must_busy zfs destroy -Rf $pool
else else
typeset list=$(zfs list -H -r -t all -o name $pool) typeset list=$(zfs list -H -r -t all -o name $pool)
for ds in $list ; do for ds in $list ; do
if [[ $ds != $pool ]] ; then if [[ $ds != $pool ]] ; then
if datasetexists $ds ; then if datasetexists $ds ; then
log_must zfs destroy -Rf $ds log_must_busy zfs destroy -Rf $ds
fi fi
fi fi
done done
@ -296,24 +296,16 @@ function destroy_tree
typeset -i ret=0 typeset -i ret=0
typeset snap typeset snap
for snap in "$@" ; do for snap in "$@" ; do
zfs destroy $snap log_must_busy zfs destroy $snap
ret=$?
typeset ds=${snap%%@*} typeset ds=${snap%%@*}
typeset type=$(get_prop "type" $ds) typeset type=$(get_prop "type" $ds)
if [[ $type == "filesystem" ]]; then if [[ $type == "filesystem" ]]; then
typeset mntpnt=$(get_prop mountpoint $ds) typeset mntpnt=$(get_prop mountpoint $ds)
((ret |= $?)) if [[ -n $mntpnt ]]; then
rm -rf $mntpnt/$snap
if ((ret != 0)); then
rm -r $mntpnt/$snap
((ret |= $?))
fi fi
fi fi
if ((ret != 0)); then
return $ret
fi
done done
return 0 return 0
@ -516,8 +508,8 @@ function test_fs_setup
typeset sendpool=${sendfs%%/*} typeset sendpool=${sendfs%%/*}
typeset recvpool=${recvfs%%/*} typeset recvpool=${recvfs%%/*}
datasetexists $sendfs && log_must zfs destroy -r $sendpool datasetexists $sendfs && log_must_busy zfs destroy -r $sendpool
datasetexists $recvfs && log_must zfs destroy -r $recvpool datasetexists $recvfs && log_must_busy zfs destroy -r $recvpool
if $(datasetexists $sendfs || zfs create -o compress=lz4 $sendfs); then if $(datasetexists $sendfs || zfs create -o compress=lz4 $sendfs); then
mk_files 1000 256 0 $sendfs & mk_files 1000 256 0 $sendfs &
@ -547,7 +539,7 @@ function test_fs_setup
fi fi
if datasetexists $streamfs; then if datasetexists $streamfs; then
log_must zfs destroy -r $streamfs log_must_busy zfs destroy -r $streamfs
fi fi
log_must zfs create -o compress=lz4 $sendpool/stream log_must zfs create -o compress=lz4 $sendpool/stream
} }
@ -664,8 +656,8 @@ function resume_cleanup
typeset sendfs=$1 typeset sendfs=$1
typeset streamfs=$2 typeset streamfs=$2
datasetexists $sendfs && log_must zfs destroy -r $sendfs datasetexists $sendfs && log_must_busy zfs destroy -r $sendfs
datasetexists $streamfs && log_must zfs destroy -r $streamfs datasetexists $streamfs && log_must_busy zfs destroy -r $streamfs
cleanup_pool $POOL2 cleanup_pool $POOL2
rm -f /$POOL/initial.zsend /$POOL/incremental.zsend rm -f /$POOL/initial.zsend /$POOL/incremental.zsend
} }

View File

@ -59,7 +59,7 @@ if is_global_zone ; then
# #
log_must eval "zfs send -I $POOL2@psnap $POOL2/pclone@final > " \ log_must eval "zfs send -I $POOL2@psnap $POOL2/pclone@final > " \
"$BACKDIR/pool-clone-I" "$BACKDIR/pool-clone-I"
log_must zfs destroy -rf $POOL2/pclone log_must_busy zfs destroy -rf $POOL2/pclone
log_must eval "zfs receive -d -F $POOL2 < $BACKDIR/pool-clone-I" log_must eval "zfs receive -d -F $POOL2 < $BACKDIR/pool-clone-I"
log_must cmp_ds_subs $POOL $POOL2 log_must cmp_ds_subs $POOL $POOL2
log_must cmp_ds_cont $POOL $POOL2 log_must cmp_ds_cont $POOL $POOL2
@ -73,7 +73,7 @@ dstds=$(get_dst_ds $POOL $POOL2)
ds=$dstds/$FS/fs1 ds=$dstds/$FS/fs1
log_must eval "zfs send -I $ds/fs2@fsnap $ds/fclone@final > " \ log_must eval "zfs send -I $ds/fs2@fsnap $ds/fclone@final > " \
"$BACKDIR/fs-clone-I" "$BACKDIR/fs-clone-I"
log_must zfs destroy -rf $ds/fclone log_must_busy zfs destroy -rf $ds/fclone
log_must eval "zfs receive -F $ds/fclone < $BACKDIR/fs-clone-I" log_must eval "zfs receive -F $ds/fclone < $BACKDIR/fs-clone-I"
log_must cmp_ds_subs $POOL $dstds log_must cmp_ds_subs $POOL $dstds
@ -86,7 +86,7 @@ if is_global_zone ; then
ds=$POOL2/$FS ds=$POOL2/$FS
log_must eval "zfs send -I $ds/vol@vsnap $ds/vclone@final > " \ log_must eval "zfs send -I $ds/vol@vsnap $ds/vclone@final > " \
"$BACKDIR/vol-clone-I" "$BACKDIR/vol-clone-I"
log_must zfs destroy -rf $ds/vclone log_must_busy zfs destroy -rf $ds/vclone
log_must eval "zfs receive -d -F $POOL2 < $BACKDIR/vol-clone-I" log_must eval "zfs receive -d -F $POOL2 < $BACKDIR/vol-clone-I"
log_must cmp_ds_subs $POOL $POOL2 log_must cmp_ds_subs $POOL $POOL2
log_must cmp_ds_cont $POOL $POOL2 log_must cmp_ds_cont $POOL $POOL2

View File

@ -48,10 +48,10 @@ verify_runnable "global"
function cleanup function cleanup
{ {
if datasetexists bpool ; then if datasetexists bpool ; then
log_must zpool destroy -f bpool log_must_busy zpool destroy -f bpool
fi fi
if datasetexists spool ; then if datasetexists spool ; then
log_must zpool destroy -f spool log_must_busy zpool destroy -f spool
fi fi
} }
@ -80,7 +80,7 @@ log_must ismounted spool
# Test out of space on top filesystem # Test out of space on top filesystem
# #
log_must mv /bpool/fs/file /bpool log_must mv /bpool/fs/file /bpool
log_must zfs destroy -rf bpool/fs log_must_busy zfs destroy -rf bpool/fs
log_must zfs snapshot bpool@snap log_must zfs snapshot bpool@snap
log_must eval "zfs send -R bpool@snap > $BACKDIR/bpool-R" log_must eval "zfs send -R bpool@snap > $BACKDIR/bpool-R"

View File

@ -45,9 +45,6 @@ verify_runnable "both"
function cleanup function cleanup
{ {
export __ZFS_POOL_RESTRICT="$POOL $POOL2"
log_must zfs unmount -a
unset __ZFS_POOL_RESTRICT
log_must cleanup_pool $POOL log_must cleanup_pool $POOL
log_must cleanup_pool $POOL2 log_must cleanup_pool $POOL2

View File

@ -66,11 +66,11 @@ cleanup
log_must eval "zfs send -R $POOL@final > $BACKDIR/pool-final-R" log_must eval "zfs send -R $POOL@final > $BACKDIR/pool-final-R"
log_must eval "zfs receive -dF $POOL2 < $BACKDIR/pool-final-R" log_must eval "zfs receive -dF $POOL2 < $BACKDIR/pool-final-R"
log_must zfs destroy -Rf $POOL/$FS log_must_busy zfs destroy -Rf $POOL/$FS
log_must zfs destroy -Rf $POOL/pclone log_must_busy zfs destroy -Rf $POOL/pclone
if is_global_zone ; then if is_global_zone ; then
log_must zfs destroy -Rf $POOL/vol log_must_busy zfs destroy -Rf $POOL/vol
fi fi
log_must zfs snapshot -r $POOL@destroy log_must zfs snapshot -r $POOL@destroy

View File

@ -33,6 +33,11 @@
verify_runnable "both" verify_runnable "both"
# See issue: https://github.com/zfsonlinux/zfs/issues/6446
if is_linux; then
log_unsupported "Test often hangs. Skipping."
fi
log_assert "Verify resumability of full ZFS send/receive with the -D " \ log_assert "Verify resumability of full ZFS send/receive with the -D " \
"(dedup) flag" "(dedup) flag"

View File

@ -35,6 +35,11 @@
verify_runnable "both" verify_runnable "both"
# See issue: https://github.com/zfsonlinux/zfs/issues/6446
if is_linux; then
log_unsupported "Test often hangs. Skipping."
fi
log_assert "Verify resumability of a full and incremental ZFS send/receive " \ log_assert "Verify resumability of a full and incremental ZFS send/receive " \
"with the -e (embedded) flag" "with the -e (embedded) flag"

View File

@ -54,10 +54,10 @@ log_onexit resume_cleanup $sendfs $streamfs
test_fs_setup $sendfs $recvfs test_fs_setup $sendfs $recvfs
log_must zfs bookmark $sendfs@a $sendfs#bm_a log_must zfs bookmark $sendfs@a $sendfs#bm_a
log_must zfs destroy $sendfs@a log_must_busy zfs destroy $sendfs@a
log_must zfs receive -v $recvfs </$POOL/initial.zsend log_must zfs receive -v $recvfs </$POOL/initial.zsend
resume_test "zfs send -i \#bm_a $sendfs@b" $streamfs $recvfs resume_test "zfs send -i \#bm_a $sendfs@b" $streamfs $recvfs
log_must zfs destroy -r -f $sendfs log_must_busy zfs destroy -r -f $sendfs
log_must zfs receive -v $sendfs </$POOL/initial.zsend log_must zfs receive -v $sendfs </$POOL/initial.zsend
log_must zfs receive -v $sendfs </$POOL/incremental.zsend log_must zfs receive -v $sendfs </$POOL/incremental.zsend
file_check $sendfs $recvfs file_check $sendfs $recvfs

View File

@ -50,7 +50,7 @@ streamfs=$POOL/stream
log_onexit resume_cleanup $sendfs $streamfs log_onexit resume_cleanup $sendfs $streamfs
test_fs_setup $sendfs $recvfs test_fs_setup $sendfs $recvfs
log_must zfs unmount $sendfs log_must zfs unmount -f $sendfs
resume_test "zfs send $sendfs" $streamfs $recvfs resume_test "zfs send $sendfs" $streamfs $recvfs
file_check $sendfs $recvfs file_check $sendfs $recvfs

View File

@ -52,8 +52,8 @@ for compress in off gzip; do
poolexists $POOL3 && destroy_pool $POOL3 poolexists $POOL3 && destroy_pool $POOL3
log_must zpool create $pool_opt $POOL3 $DISK3 log_must zpool create $pool_opt $POOL3 $DISK3
datasetexists $send_ds && log_must zfs destroy -r $send_ds datasetexists $send_ds && log_must_busy zfs destroy -r $send_ds
datasetexists $recv_ds && log_must zfs destroy -r $recv_ds datasetexists $recv_ds && log_must_busy zfs destroy -r $recv_ds
log_must zfs create -o compress=$compress $send_ds log_must zfs create -o compress=$compress $send_ds
typeset dir=$(get_prop mountpoint $send_ds) typeset dir=$(get_prop mountpoint $send_ds)
@ -63,7 +63,7 @@ for compress in off gzip; do
log_must eval "zfs send -c $send_ds@full >$BACKDIR/full-c" log_must eval "zfs send -c $send_ds@full >$BACKDIR/full-c"
log_must eval "zfs recv $recv_ds <$BACKDIR/full-c" log_must eval "zfs recv $recv_ds <$BACKDIR/full-c"
log_must zfs destroy -r $recv_ds log_must_busy zfs destroy -r $recv_ds
log_must eval "zfs send $send_ds@full >$BACKDIR/full" log_must eval "zfs send $send_ds@full >$BACKDIR/full"
log_must eval "zfs recv $recv_ds <$BACKDIR/full" log_must eval "zfs recv $recv_ds <$BACKDIR/full"

View File

@ -50,8 +50,8 @@ datasetexists $POOL3 && log_must zpool destroy $POOL3
log_must zpool create -d $POOL3 $DISK3 log_must zpool create -d $POOL3 $DISK3
for compress in $compress_types; do for compress in $compress_types; do
datasetexists $send_ds && log_must zfs destroy -r $send_ds datasetexists $send_ds && log_must_busy zfs destroy -r $send_ds
datasetexists $recv_ds && log_must zfs destroy -r $recv_ds datasetexists $recv_ds && log_must_busy zfs destroy -r $recv_ds
log_must zfs create -o compress=$compress $send_ds log_must zfs create -o compress=$compress $send_ds
typeset dir=$(get_prop mountpoint $send_ds) typeset dir=$(get_prop mountpoint $send_ds)

View File

@ -56,8 +56,8 @@ log_onexit cleanup_pool $POOL2
write_compressible $BACKDIR ${megs}m write_compressible $BACKDIR ${megs}m
for compress in $compress_types; do for compress in $compress_types; do
datasetexists $send_ds && log_must zfs destroy -r $send_ds datasetexists $send_ds && log_must_busy zfs destroy -r $send_ds
datasetexists $send_vol && log_must zfs destroy -r $send_vol datasetexists $send_vol && log_must_busy zfs destroy -r $send_vol
log_must zfs create -o compress=$compress $send_ds log_must zfs create -o compress=$compress $send_ds
log_must zfs create -V 1g -o compress=$compress $send_vol log_must zfs create -V 1g -o compress=$compress $send_vol

View File

@ -59,7 +59,7 @@ for prop in $(get_rand_compress_any 6); do
verify_stream_size $BACKDIR/compressed $sendfs verify_stream_size $BACKDIR/compressed $sendfs
log_must rm $BACKDIR/uncompressed $BACKDIR/compressed log_must rm $BACKDIR/uncompressed $BACKDIR/compressed
log_must zfs destroy -r $sendfs log_must_busy zfs destroy -r $sendfs
done done
done done

View File

@ -29,7 +29,7 @@
function cleanup function cleanup
{ {
log_must zfs destroy -r $vol log_must_busy zfs destroy -r $vol
cleanup_pool $POOL2 cleanup_pool $POOL2
} }

View File

@ -55,8 +55,8 @@ verify_runnable "both"
function cleanup function cleanup
{ {
datasetexists $TESTPOOL/128k && log_must zfs destroy $TESTPOOL/128k datasetexists $TESTPOOL/128k && log_must_busy zfs destroy $TESTPOOL/128k
datasetexists $TESTPOOL/1m && log_must zfs destroy $TESTPOOL/1m datasetexists $TESTPOOL/1m && log_must_busy zfs destroy $TESTPOOL/1m
cleanup_pool $POOL2 cleanup_pool $POOL2
destroy_pool $POOL3 destroy_pool $POOL3
} }
@ -153,7 +153,7 @@ function check
check_recsize $recv_ds $expected_file_bs $expected_recsize check_recsize $recv_ds $expected_file_bs $expected_recsize
$do_size_test && verify_stream_size $stream $recv_ds $do_size_test && verify_stream_size $stream $recv_ds
log_must zfs destroy -r $recv_ds log_must_busy zfs destroy -r $recv_ds
} }
log_assert "Verify compressed send works with datasets of varying recsize." log_assert "Verify compressed send works with datasets of varying recsize."