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:
parent
ecb2b7dc7f
commit
e3bdcb8ad8
|
@ -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`
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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."
|
||||||
|
|
Loading…
Reference in New Issue