Print this page
7290 ZFS test suite needs to control what utilities it can run
Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
*** 23,33 ****
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#
! # Copyright (c) 2013, 2015 by Delphix. All rights reserved.
#
. $STF_SUITE/include/libtest.shlib
. $STF_SUITE/tests/functional/rsend/rsend.cfg
--- 23,33 ----
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#
! # Copyright (c) 2013, 2016 by Delphix. All rights reserved.
#
. $STF_SUITE/include/libtest.shlib
. $STF_SUITE/tests/functional/rsend/rsend.cfg
*** 64,89 ****
#
function setup_test_model
{
typeset pool=$1
! log_must $ZFS create -p $pool/$FS/fs1/fs2
! log_must $ZFS snapshot $pool@psnap
! log_must $ZFS clone $pool@psnap $pool/pclone
if is_global_zone ; then
! log_must $ZFS create -V 16M $pool/vol
! log_must $ZFS create -V 16M $pool/$FS/vol
! log_must $ZFS snapshot $pool/$FS/vol@vsnap
! log_must $ZFS clone $pool/$FS/vol@vsnap $pool/$FS/vclone
fi
log_must snapshot_tree $pool/$FS/fs1/fs2@fsnap
! log_must $ZFS clone $pool/$FS/fs1/fs2@fsnap $pool/$FS/fs1/fclone
! log_must $ZFS snapshot -r $pool@init
log_must snapshot_tree $pool@snapA
log_must snapshot_tree $pool@snapC
log_must snapshot_tree $pool/pclone@snapB
log_must snapshot_tree $pool/$FS@snapB
--- 64,89 ----
#
function setup_test_model
{
typeset pool=$1
! log_must zfs create -p $pool/$FS/fs1/fs2
! log_must zfs snapshot $pool@psnap
! log_must zfs clone $pool@psnap $pool/pclone
if is_global_zone ; then
! log_must zfs create -V 16M $pool/vol
! log_must zfs create -V 16M $pool/$FS/vol
! log_must zfs snapshot $pool/$FS/vol@vsnap
! log_must zfs clone $pool/$FS/vol@vsnap $pool/$FS/vclone
fi
log_must snapshot_tree $pool/$FS/fs1/fs2@fsnap
! log_must zfs clone $pool/$FS/fs1/fs2@fsnap $pool/$FS/fs1/fclone
! log_must zfs snapshot -r $pool@init
log_must snapshot_tree $pool@snapA
log_must snapshot_tree $pool@snapC
log_must snapshot_tree $pool/pclone@snapB
log_must snapshot_tree $pool/$FS@snapB
*** 92,108 ****
log_must snapshot_tree $pool/$FS/fs1@snapB
log_must snapshot_tree $pool/$FS/fs1@snapC
log_must snapshot_tree $pool/$FS/fs1/fclone@snapA
if is_global_zone ; then
! log_must $ZFS snapshot $pool/vol@snapA
! log_must $ZFS snapshot $pool/$FS/vol@snapB
! log_must $ZFS snapshot $pool/$FS/vol@snapC
! log_must $ZFS snapshot $pool/$FS/vclone@snapC
fi
! log_must $ZFS snapshot -r $pool@final
return 0
}
#
--- 92,108 ----
log_must snapshot_tree $pool/$FS/fs1@snapB
log_must snapshot_tree $pool/$FS/fs1@snapC
log_must snapshot_tree $pool/$FS/fs1/fclone@snapA
if is_global_zone ; then
! log_must zfs snapshot $pool/vol@snapA
! log_must zfs snapshot $pool/$FS/vol@snapB
! log_must zfs snapshot $pool/$FS/vol@snapC
! log_must zfs snapshot $pool/$FS/vclone@snapC
fi
! log_must zfs snapshot -r $pool@final
return 0
}
#
*** 111,146 ****
# $1 pool name
#
function cleanup_pool
{
typeset pool=$1
! log_must $RM -rf $BACKDIR/*
if is_global_zone ; then
! log_must $ZFS destroy -Rf $pool
else
! typeset list=$($ZFS list -H -r -t filesystem,snapshot,volume -o name $pool)
for ds in $list ; do
if [[ $ds != $pool ]] ; then
if datasetexists $ds ; then
! log_must $ZFS destroy -Rf $ds
fi
fi
done
fi
typeset mntpnt=$(get_prop mountpoint $pool)
if ! ismounted $pool ; then
# Make sure mountpoint directory is empty
if [[ -d $mntpnt ]]; then
! log_must $RM -rf $mntpnt/*
fi
! log_must $ZFS mount $pool
fi
if [[ -d $mntpnt ]]; then
! log_must $RM -rf $mntpnt/*
fi
return 0
}
--- 111,146 ----
# $1 pool name
#
function cleanup_pool
{
typeset pool=$1
! log_must rm -rf $BACKDIR/*
if is_global_zone ; then
! log_must zfs destroy -Rf $pool
else
! typeset list=$(zfs list -H -r -t filesystem,snapshot,volume -o name $pool)
for ds in $list ; do
if [[ $ds != $pool ]] ; then
if datasetexists $ds ; then
! log_must zfs destroy -Rf $ds
fi
fi
done
fi
typeset mntpnt=$(get_prop mountpoint $pool)
if ! ismounted $pool ; then
# Make sure mountpoint directory is empty
if [[ -d $mntpnt ]]; then
! log_must rm -rf $mntpnt/*
fi
! log_must zfs mount $pool
fi
if [[ -d $mntpnt ]]; then
! log_must rm -rf $mntpnt/*
fi
return 0
}
*** 153,172 ****
function cmp_ds_subs
{
typeset src_fs=$1
typeset dst_fs=$2
! $ZFS list -r -H -t filesystem,snapshot,volume -o name $src_fs > $BACKDIR/src1
! $ZFS list -r -H -t filesystem,snapshot,volume -o name $dst_fs > $BACKDIR/dst1
! eval $SED -e 's:^$src_fs:PREFIX:g' < $BACKDIR/src1 > $BACKDIR/src
! eval $SED -e 's:^$dst_fs:PREFIX:g' < $BACKDIR/dst1 > $BACKDIR/dst
! $DIFF $BACKDIR/src $BACKDIR/dst
typeset -i ret=$?
! $RM -f $BACKDIR/src $BACKDIR/dst $BACKDIR/src1 $BACKDIR/dst1
return $ret
}
#
--- 153,172 ----
function cmp_ds_subs
{
typeset src_fs=$1
typeset dst_fs=$2
! zfs list -r -H -t filesystem,snapshot,volume -o name $src_fs > $BACKDIR/src1
! zfs list -r -H -t filesystem,snapshot,volume -o name $dst_fs > $BACKDIR/dst1
! eval sed -e 's:^$src_fs:PREFIX:g' < $BACKDIR/src1 > $BACKDIR/src
! eval sed -e 's:^$dst_fs:PREFIX:g' < $BACKDIR/dst1 > $BACKDIR/dst
! diff $BACKDIR/src $BACKDIR/dst
typeset -i ret=$?
! rm -f $BACKDIR/src $BACKDIR/dst $BACKDIR/src1 $BACKDIR/dst1
return $ret
}
#
*** 182,192 ****
typeset srcdir dstdir
srcdir=$(get_prop mountpoint $src_fs)
dstdir=$(get_prop mountpoint $dst_fs)
! $DIFF -r $srcdir $dstdir > /dev/null 2>&1
echo $?
}
#
# Compare the given two dataset properties
--- 182,192 ----
typeset srcdir dstdir
srcdir=$(get_prop mountpoint $src_fs)
dstdir=$(get_prop mountpoint $dst_fs)
! diff -r $srcdir $dstdir > /dev/null 2>&1
echo $?
}
#
# Compare the given two dataset properties
*** 203,225 ****
"atime" "canmount" "checksum" "compression" "copies" "devices" \
"exec" "quota" "readonly" "recordsize" "reservation" "setuid" \
"sharenfs" "snapdir" "version" "volsize" "xattr" "zoned" \
"mountpoint";
do
! $ZFS get -H -o property,value,source $item $dtst1 >> \
$BACKDIR/dtst1
! $ZFS get -H -o property,value,source $item $dtst2 >> \
$BACKDIR/dtst2
done
! eval $SED -e 's:$dtst1:PREFIX:g' < $BACKDIR/dtst1 > $BACKDIR/dtst1
! eval $SED -e 's:$dtst2:PREFIX:g' < $BACKDIR/dtst2 > $BACKDIR/dtst2
! $DIFF $BACKDIR/dtst1 $BACKDIR/dtst2
typeset -i ret=$?
! $RM -f $BACKDIR/dtst1 $BACKDIR/dtst2
return $ret
}
--- 203,225 ----
"atime" "canmount" "checksum" "compression" "copies" "devices" \
"exec" "quota" "readonly" "recordsize" "reservation" "setuid" \
"sharenfs" "snapdir" "version" "volsize" "xattr" "zoned" \
"mountpoint";
do
! zfs get -H -o property,value,source $item $dtst1 >> \
$BACKDIR/dtst1
! zfs get -H -o property,value,source $item $dtst2 >> \
$BACKDIR/dtst2
done
! eval sed -e 's:$dtst1:PREFIX:g' < $BACKDIR/dtst1 > $BACKDIR/dtst1
! eval sed -e 's:$dtst2:PREFIX:g' < $BACKDIR/dtst2 > $BACKDIR/dtst2
! diff $BACKDIR/dtst1 $BACKDIR/dtst2
typeset -i ret=$?
! rm -f $BACKDIR/dtst1 $BACKDIR/dtst2
return $ret
}
*** 231,250 ****
function random_tree
{
typeset dir=$1
if [[ -d $dir ]]; then
! $RM -rf $dir
fi
! $MKDIR -p $dir
typeset -i ret=$?
typeset -i nl nd nf
((nl = RANDOM % 6 + 1))
((nd = RANDOM % 3 ))
((nf = RANDOM % 5 ))
! $MKTREE -b $dir -l $nl -d $nd -f $nf
((ret |= $?))
return $ret
}
--- 231,250 ----
function random_tree
{
typeset dir=$1
if [[ -d $dir ]]; then
! rm -rf $dir
fi
! mkdir -p $dir
typeset -i ret=$?
typeset -i nl nd nf
((nl = RANDOM % 6 + 1))
((nd = RANDOM % 3 ))
((nf = RANDOM % 5 ))
! mktree -b $dir -l $nl -d $nd -f $nf
((ret |= $?))
return $ret
}
*** 269,279 ****
((ret |= $?))
fi
fi
if ((ret == 0)) ; then
! $ZFS snapshot $snap
((ret |= $?))
fi
return $ret
}
--- 269,279 ----
((ret |= $?))
fi
fi
if ((ret == 0)) ; then
! zfs snapshot $snap
((ret |= $?))
fi
return $ret
}
*** 286,306 ****
function destroy_tree
{
typeset -i ret=0
typeset snap
for snap in "$@" ; do
! $ZFS destroy $snap
ret=$?
typeset ds=${snap%%@*}
typeset type=$(get_prop "type" $ds)
if [[ $type == "filesystem" ]]; then
typeset mntpnt=$(get_prop mountpoint $ds)
((ret |= $?))
if ((ret != 0)); then
! $RM -r $mntpnt/$snap
((ret |= $?))
fi
fi
if ((ret != 0)); then
--- 286,306 ----
function destroy_tree
{
typeset -i ret=0
typeset snap
for snap in "$@" ; do
! zfs destroy $snap
ret=$?
typeset ds=${snap%%@*}
typeset type=$(get_prop "type" $ds)
if [[ $type == "filesystem" ]]; then
typeset mntpnt=$(get_prop mountpoint $ds)
((ret |= $?))
if ((ret != 0)); then
! rm -r $mntpnt/$snap
((ret |= $?))
fi
fi
if ((ret != 0)); then
*** 320,362 ****
function getds_with_suffix
{
typeset ds=$1
typeset suffix=$2
! typeset list=$($ZFS list -r -H -t filesystem,snapshot,volume -o name $ds \
! | $GREP "$suffix$")
! $ECHO $list
}
#
# Output inherited properties whitch is edited for file system
#
function fs_inherit_prop
{
typeset fs_prop
if is_global_zone ; then
! fs_prop=$($ZFS inherit 2>&1 | \
! $AWK '$2=="YES" && $3=="YES" {print $1}')
if ! is_te_enabled ; then
! fs_prop=$(echo $fs_prop | $GREP -v "mlslabel")
fi
else
! fs_prop=$($ZFS inherit 2>&1 | \
! $AWK '$2=="YES" && $3=="YES" {print $1}'|
! $EGREP -v "devices|mlslabel|sharenfs|sharesmb|zoned")
fi
! $ECHO $fs_prop
}
#
# Output inherited properties for volume
#
function vol_inherit_prop
{
! $ECHO "checksum readonly"
}
#
# Get the destination dataset to compare
#
--- 320,362 ----
function getds_with_suffix
{
typeset ds=$1
typeset suffix=$2
! typeset list=$(zfs list -r -H -t filesystem,snapshot,volume -o name $ds \
! | grep "$suffix$")
! echo $list
}
#
# Output inherited properties whitch is edited for file system
#
function fs_inherit_prop
{
typeset fs_prop
if is_global_zone ; then
! fs_prop=$(zfs inherit 2>&1 | \
! awk '$2=="YES" && $3=="YES" {print $1}')
if ! is_te_enabled ; then
! fs_prop=$(echo $fs_prop | grep -v "mlslabel")
fi
else
! fs_prop=$(zfs inherit 2>&1 | \
! awk '$2=="YES" && $3=="YES" {print $1}'|
! egrep -v "devices|mlslabel|sharenfs|sharesmb|zoned")
fi
! echo $fs_prop
}
#
# Output inherited properties for volume
#
function vol_inherit_prop
{
! echo "checksum readonly"
}
#
# Get the destination dataset to compare
#
*** 366,380 ****
typeset dstfs=$2
#
# If the srcfs is not pool
#
! if ! $ZPOOL list $srcfs > /dev/null 2>&1 ; then
eval dstfs="$dstfs/${srcfs#*/}"
fi
! $ECHO $dstfs
}
#
# Make test files
#
--- 366,380 ----
typeset dstfs=$2
#
# If the srcfs is not pool
#
! if ! zpool list $srcfs > /dev/null 2>&1 ; then
eval dstfs="$dstfs/${srcfs#*/}"
fi
! echo $dstfs
}
#
# Make test files
#
*** 389,405 ****
maxsize=$2
file_id_offset=$3
fs=$4
for ((i=0; i<$nfiles; i=i+1)); do
! $DD if=/dev/urandom \
of=/$fs/file-$maxsize-$((i+$file_id_offset)) \
bs=$(($RANDOM * $RANDOM % $maxsize)) \
count=1 >/dev/null 2>&1 || log_fail \
"Failed to create /$fs/file-$maxsize-$((i+$file_id_offset))"
done
! $ECHO Created $nfiles files of random sizes up to $maxsize bytes
}
#
# Remove test files
#
--- 389,405 ----
maxsize=$2
file_id_offset=$3
fs=$4
for ((i=0; i<$nfiles; i=i+1)); do
! dd if=/dev/urandom \
of=/$fs/file-$maxsize-$((i+$file_id_offset)) \
bs=$(($RANDOM * $RANDOM % $maxsize)) \
count=1 >/dev/null 2>&1 || log_fail \
"Failed to create /$fs/file-$maxsize-$((i+$file_id_offset))"
done
! echo Created $nfiles files of random sizes up to $maxsize bytes
}
#
# Remove test files
#
*** 414,426 ****
maxsize=$2
file_id_offset=$3
fs=$4
for ((i=0; i<$nfiles; i=i+1)); do
! $RM -f /$fs/file-$maxsize-$((i+$file_id_offset))
done
! $ECHO Removed $nfiles files of random sizes up to $maxsize bytes
}
#
# Mess up file contents
#
--- 414,426 ----
maxsize=$2
file_id_offset=$3
fs=$4
for ((i=0; i<$nfiles; i=i+1)); do
! rm -f /$fs/file-$maxsize-$((i+$file_id_offset))
done
! echo Removed $nfiles files of random sizes up to $maxsize bytes
}
#
# Mess up file contents
#
*** 428,448 ****
#
function mess_file
{
file=$1
! filesize=$($STAT -c '%s' $file)
offset=$(($RANDOM * $RANDOM % $filesize))
if (($RANDOM % 7 <= 1)); then
#
# We corrupt 2 bytes to minimize the chance that we
# write the same value that's already there.
#
! log_must eval "$DD if=/dev/random of=$file conv=notrunc " \
"bs=1 count=2 oseek=$offset >/dev/null 2>&1"
else
! log_must $TRUNCATE -s $offset $file
fi
}
#
# Diff the send/receive filesystems
--- 428,448 ----
#
function mess_file
{
file=$1
! filesize=$(stat -c '%s' $file)
offset=$(($RANDOM * $RANDOM % $filesize))
if (($RANDOM % 7 <= 1)); then
#
# We corrupt 2 bytes to minimize the chance that we
# write the same value that's already there.
#
! log_must eval "dd if=/dev/random of=$file conv=notrunc " \
"bs=1 count=2 oseek=$offset >/dev/null 2>&1"
else
! log_must truncate -s $offset $file
fi
}
#
# Diff the send/receive filesystems
*** 455,470 ****
sendfs=$1
recvfs=$2
if [[ -d /$recvfs/.zfs/snapshot/a && -d \
/$sendfs/.zfs/snapshot/a ]]; then
! $DIFF -r /$recvfs/.zfs/snapshot/a /$sendfs/.zfs/snapshot/a
[[ $? -eq 0 ]] || log_fail "Differences found in snap a"
fi
if [[ -d /$recvfs/.zfs/snapshot/b && -d \
/$sendfs/.zfs/snapshot/b ]]; then
! $DIFF -r /$recvfs/.zfs/snapshot/b /$sendfs/.zfs/snapshot/b
[[ $? -eq 0 ]] || log_fail "Differences found in snap b"
fi
}
#
--- 455,470 ----
sendfs=$1
recvfs=$2
if [[ -d /$recvfs/.zfs/snapshot/a && -d \
/$sendfs/.zfs/snapshot/a ]]; then
! diff -r /$recvfs/.zfs/snapshot/a /$sendfs/.zfs/snapshot/a
[[ $? -eq 0 ]] || log_fail "Differences found in snap a"
fi
if [[ -d /$recvfs/.zfs/snapshot/b && -d \
/$sendfs/.zfs/snapshot/b ]]; then
! diff -r /$recvfs/.zfs/snapshot/b /$sendfs/.zfs/snapshot/b
[[ $? -eq 0 ]] || log_fail "Differences found in snap b"
fi
}
#
*** 483,501 ****
stream_num=1
log_must eval "$sendcmd >/$streamfs/$stream_num"
for ((i=0; i<2; i=i+1)); do
mess_file /$streamfs/$stream_num
! log_mustnot $ZFS recv -sv $recvfs </$streamfs/$stream_num
stream_num=$((stream_num+1))
! token=$($ZFS get -Hp -o value receive_resume_token $recvfs)
! log_must eval "$ZFS send -v -t $token >/$streamfs/$stream_num"
[[ -f /$streamfs/$stream_num ]] || \
log_fail "NO FILE /$streamfs/$stream_num"
done
! log_must $ZFS recv -sv $recvfs </$streamfs/$stream_num
}
#
# Setup filesystems for the resumable send/receive tests
#
--- 483,501 ----
stream_num=1
log_must eval "$sendcmd >/$streamfs/$stream_num"
for ((i=0; i<2; i=i+1)); do
mess_file /$streamfs/$stream_num
! log_mustnot zfs recv -sv $recvfs </$streamfs/$stream_num
stream_num=$((stream_num+1))
! token=$(zfs get -Hp -o value receive_resume_token $recvfs)
! log_must eval "zfs send -v -t $token >/$streamfs/$stream_num"
[[ -f /$streamfs/$stream_num ]] || \
log_fail "NO FILE /$streamfs/$stream_num"
done
! log_must zfs recv -sv $recvfs </$streamfs/$stream_num
}
#
# Setup filesystems for the resumable send/receive tests
#
*** 510,551 ****
sendfs=$sendpool/sendfs
recvfs=$recvpool/recvfs
streamfs=$sendpool/stream
if datasetexists $recvfs; then
! log_must $ZFS destroy -r $recvfs
fi
if datasetexists $sendfs; then
! log_must $ZFS destroy -r $sendfs
fi
! if $($ZFS create -o compress=lz4 $sendfs); then
mk_files 1000 256 0 $sendfs &
mk_files 1000 131072 0 $sendfs &
mk_files 100 1048576 0 $sendfs &
mk_files 10 10485760 0 $sendfs &
mk_files 1 104857600 0 $sendfs &
! log_must $WAIT
! log_must $ZFS snapshot $sendfs@a
rm_files 200 256 0 $sendfs &
rm_files 200 131072 0 $sendfs &
rm_files 20 1048576 0 $sendfs &
rm_files 2 10485760 0 $sendfs &
! log_must $WAIT
mk_files 400 256 0 $sendfs &
mk_files 400 131072 0 $sendfs &
mk_files 40 1048576 0 $sendfs &
mk_files 4 10485760 0 $sendfs &
! log_must $WAIT
! log_must $ZFS snapshot $sendfs@b
! log_must eval "$ZFS send -v $sendfs@a >/$sendpool/initial.zsend"
! log_must eval "$ZFS send -v -i @a $sendfs@b " \
">/$sendpool/incremental.zsend"
fi
if datasetexists $streamfs; then
! log_must $ZFS destroy -r $streamfs
fi
! log_must $ZFS create -o compress=lz4 $sendpool/stream
}
--- 510,551 ----
sendfs=$sendpool/sendfs
recvfs=$recvpool/recvfs
streamfs=$sendpool/stream
if datasetexists $recvfs; then
! log_must zfs destroy -r $recvfs
fi
if datasetexists $sendfs; then
! log_must zfs destroy -r $sendfs
fi
! if $(zfs create -o compress=lz4 $sendfs); then
mk_files 1000 256 0 $sendfs &
mk_files 1000 131072 0 $sendfs &
mk_files 100 1048576 0 $sendfs &
mk_files 10 10485760 0 $sendfs &
mk_files 1 104857600 0 $sendfs &
! log_must wait
! log_must zfs snapshot $sendfs@a
rm_files 200 256 0 $sendfs &
rm_files 200 131072 0 $sendfs &
rm_files 20 1048576 0 $sendfs &
rm_files 2 10485760 0 $sendfs &
! log_must wait
mk_files 400 256 0 $sendfs &
mk_files 400 131072 0 $sendfs &
mk_files 40 1048576 0 $sendfs &
mk_files 4 10485760 0 $sendfs &
! log_must wait
! log_must zfs snapshot $sendfs@b
! log_must eval "zfs send -v $sendfs@a >/$sendpool/initial.zsend"
! log_must eval "zfs send -v -i @a $sendfs@b " \
">/$sendpool/incremental.zsend"
fi
if datasetexists $streamfs; then
! log_must zfs destroy -r $streamfs
fi
! log_must zfs create -o compress=lz4 $sendpool/stream
}