f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# CDDL HEADER START
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# The contents of this file are subject to the terms of the
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Common Development and Distribution License (the "License").
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# You may not use this file except in compliance with the License.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# or http://www.opensolaris.org/os/licensing.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# See the License for the specific language governing permissions
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# and limitations under the License.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# When distributing Covered Code, include this CDDL HEADER in each
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# If applicable, add the following below this CDDL HEADER, with the
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# fields enclosed by brackets "[]" replaced with your own identifying
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# information: Portions Copyright [yyyy] [name of copyright owner]
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# CDDL HEADER END
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Use is subject to license terms.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy# Copyright (c) 2013, 2016 by Delphix. All rights reserved.
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy. $STF_SUITE/include/libtest.shlib
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel. $STF_SUITE/include/math.shlib
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy. $STF_SUITE/tests/functional/rsend/rsend.cfg
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Set up test model which includes various datasets
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# @final
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# @snapB
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# @init
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# |
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# ______ pclone
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# | /
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# |@psnap
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# || @final
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# ||@final @final @snapC
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# ||@snapC @snapC @snapB
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# ||@snapA @snapB @snapA
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# ||@init @init @init
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# ||| | |
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $pool -------- $FS ------- fs1 ------- fs2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# \ \\_____ \ |
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# vol vol \____ \ @fsnap
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# | | \ \ \
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# @init @vsnap | ------------ fclone
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# @snapA @init \ | |
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# @final @snapB \ | @init
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# @snapC vclone @snapA
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# @final | @final
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# @init
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# @snapC
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# @final
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 pool name
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction setup_test_model
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset pool=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs create -p $pool/$FS/fs1/fs2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs snapshot $pool@psnap
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs clone $pool@psnap $pool/pclone
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if is_global_zone ; then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs create -V 16M $pool/vol
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs create -V 16M $pool/$FS/vol
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs snapshot $pool/$FS/vol@vsnap
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs clone $pool/$FS/vol@vsnap $pool/$FS/vclone
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_must snapshot_tree $pool/$FS/fs1/fs2@fsnap
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs clone $pool/$FS/fs1/fs2@fsnap $pool/$FS/fs1/fclone
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs snapshot -r $pool@init
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_must snapshot_tree $pool@snapA
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_must snapshot_tree $pool@snapC
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_must snapshot_tree $pool/pclone@snapB
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_must snapshot_tree $pool/$FS@snapB
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_must snapshot_tree $pool/$FS@snapC
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_must snapshot_tree $pool/$FS/fs1@snapA
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_must snapshot_tree $pool/$FS/fs1@snapB
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_must snapshot_tree $pool/$FS/fs1@snapC
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy log_must snapshot_tree $pool/$FS/fs1/fclone@snapA
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if is_global_zone ; then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs snapshot $pool/vol@snapA
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs snapshot $pool/$FS/vol@snapB
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs snapshot $pool/$FS/vol@snapC
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs snapshot $pool/$FS/vclone@snapC
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs snapshot -r $pool@final
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return 0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Cleanup the BACKDIR and given pool content and all the sub datasets
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 pool name
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction cleanup_pool
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset pool=$1
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must rm -rf $BACKDIR/*
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if is_global_zone ; then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs destroy -Rf $pool
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy else
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy typeset list=$(zfs list -H -r -t all -o name $pool)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy for ds in $list ; do
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ $ds != $pool ]] ; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if datasetexists $ds ; then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs destroy -Rf $ds
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset mntpnt=$(get_prop mountpoint $pool)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ! ismounted $pool ; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy # Make sure mountpoint directory is empty
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ -d $mntpnt ]]; then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must rm -rf $mntpnt/*
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs mount $pool
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ -d $mntpnt ]]; then
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy rm -rf $mntpnt/*
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return 0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedyfunction cleanup_pools
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy{
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy cleanup_pool $POOL2
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy destroy_pool $POOL3
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy}
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Detect if the given two filesystems have same sub-datasets
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 source filesystem
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $2 destination filesystem
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction cmp_ds_subs
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset src_fs=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset dst_fs=$2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy zfs list -r -H -t all -o name $src_fs > $BACKDIR/src1
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy zfs list -r -H -t all -o name $dst_fs > $BACKDIR/dst1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy eval sed -e 's:^$src_fs:PREFIX:g' < $BACKDIR/src1 > $BACKDIR/src
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy eval sed -e 's:^$dst_fs:PREFIX:g' < $BACKDIR/dst1 > $BACKDIR/dst
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy diff $BACKDIR/src $BACKDIR/dst
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i ret=$?
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy rm -f $BACKDIR/src $BACKDIR/dst $BACKDIR/src1 $BACKDIR/dst1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return $ret
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Compare all the directores and files in two filesystems
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 source filesystem
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $2 destination filesystem
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction cmp_ds_cont
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset src_fs=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset dst_fs=$2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset srcdir dstdir
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy srcdir=$(get_prop mountpoint $src_fs)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy dstdir=$(get_prop mountpoint $dst_fs)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy diff -r $srcdir $dstdir > /dev/null 2>&1
5dc1fd74a412d1fb1af3c2b8b3df3473b7588e14John Wren Kennedy return $?
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Compare the given two dataset properties
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 dataset 1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $2 dataset 2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction cmp_ds_prop
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset dtst1=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset dtst2=$2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy for item in "type" "origin" "volblocksize" "aclinherit" "aclmode" \
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens "atime" "canmount" "checksum" "compression" "copies" "devices" \
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens "exec" "quota" "readonly" "recordsize" "reservation" "setuid" \
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens "sharenfs" "snapdir" "version" "volsize" "xattr" "zoned" \
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens "mountpoint";
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy do
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy zfs get -H -o property,value,source $item $dtst1 >> \
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens $BACKDIR/dtst1
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy zfs get -H -o property,value,source $item $dtst2 >> \
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens $BACKDIR/dtst2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy eval sed -e 's:$dtst1:PREFIX:g' < $BACKDIR/dtst1 > $BACKDIR/dtst1
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy eval sed -e 's:$dtst2:PREFIX:g' < $BACKDIR/dtst2 > $BACKDIR/dtst2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy diff $BACKDIR/dtst1 $BACKDIR/dtst2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i ret=$?
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy rm -f $BACKDIR/dtst1 $BACKDIR/dtst2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return $ret
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Random create directories and files
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 directory
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction random_tree
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset dir=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ -d $dir ]]; then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy rm -rf $dir
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy mkdir -p $dir
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i ret=$?
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i nl nd nf
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ((nl = RANDOM % 6 + 1))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ((nd = RANDOM % 3 ))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ((nf = RANDOM % 5 ))
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy mktree -b $dir -l $nl -d $nd -f $nf
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ((ret |= $?))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return $ret
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Put data in filesystem and take snapshot
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 snapshot name
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction snapshot_tree
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset snap=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset ds=${snap%%@*}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset type=$(get_prop "type" $ds)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i ret=0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ $type == "filesystem" ]]; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset mntpnt=$(get_prop mountpoint $ds)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ((ret |= $?))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ((ret == 0)) ; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy eval random_tree $mntpnt/${snap##$ds}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ((ret |= $?))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ((ret == 0)) ; then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy zfs snapshot $snap
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ((ret |= $?))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return $ret
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Destroy the given snapshot and stuff
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 snapshot
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction destroy_tree
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset -i ret=0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset snap
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy for snap in "$@" ; do
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy zfs destroy $snap
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ret=$?
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset ds=${snap%%@*}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset type=$(get_prop "type" $ds)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if [[ $type == "filesystem" ]]; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset mntpnt=$(get_prop mountpoint $ds)
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ((ret |= $?))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ((ret != 0)); then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy rm -r $mntpnt/$snap
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy ((ret |= $?))
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ((ret != 0)); then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return $ret
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy done
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy return 0
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Get all the sub-datasets of give dataset with specific suffix
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $1 Given dataset
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# $2 Suffix
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction getds_with_suffix
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset ds=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset suffix=$2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy typeset list=$(zfs list -r -H -t all -o name $ds | grep "$suffix$")
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy echo $list
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Output inherited properties whitch is edited for file system
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction fs_inherit_prop
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset fs_prop
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if is_global_zone ; then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy fs_prop=$(zfs inherit 2>&1 | \
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy awk '$2=="YES" && $3=="YES" {print $1}')
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy if ! is_te_enabled ; then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy fs_prop=$(echo $fs_prop | grep -v "mlslabel")
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy else
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy fs_prop=$(zfs inherit 2>&1 | \
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy awk '$2=="YES" && $3=="YES" {print $1}'|
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy egrep -v "devices|mlslabel|sharenfs|sharesmb|zoned")
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy echo $fs_prop
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Output inherited properties for volume
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction vol_inherit_prop
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy echo "checksum readonly"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy# Get the destination dataset to compare
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy#
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedyfunction get_dst_ds
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy{
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset srcfs=$1
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy typeset dstfs=$2
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy #
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy # If the srcfs is not pool
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy #
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy if ! zpool list $srcfs > /dev/null 2>&1 ; then
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy eval dstfs="$dstfs/${srcfs#*/}"
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy fi
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy echo $dstfs
f38cb554a534c6df738be3f4d23327e69888e634John Wren Kennedy}
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# Make test files
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# $1 Number of files to create
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# $2 Maximum file size
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# $3 File ID offset
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# $4 File system to create the files on
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrensfunction mk_files
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens{
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens nfiles=$1
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens maxsize=$2
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens file_id_offset=$3
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens fs=$4
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens for ((i=0; i<$nfiles; i=i+1)); do
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy dd if=/dev/urandom \
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens of=/$fs/file-$maxsize-$((i+$file_id_offset)) \
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens bs=$(($RANDOM * $RANDOM % $maxsize)) \
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens count=1 >/dev/null 2>&1 || log_fail \
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens "Failed to create /$fs/file-$maxsize-$((i+$file_id_offset))"
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens done
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy echo Created $nfiles files of random sizes up to $maxsize bytes
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens}
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# Remove test files
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# $1 Number of files to remove
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# $2 Maximum file size
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# $3 File ID offset
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# $4 File system to remove the files from
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrensfunction rm_files
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens{
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens nfiles=$1
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens maxsize=$2
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens file_id_offset=$3
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens fs=$4
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens for ((i=0; i<$nfiles; i=i+1)); do
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy rm -f /$fs/file-$maxsize-$((i+$file_id_offset))
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens done
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy echo Removed $nfiles files of random sizes up to $maxsize bytes
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens}
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# Mess up file contents
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# $1 The file path
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrensfunction mess_file
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens{
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens file=$1
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy filesize=$(stat -c '%s' $file)
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens offset=$(($RANDOM * $RANDOM % $filesize))
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens if (($RANDOM % 7 <= 1)); then
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens #
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens # We corrupt 2 bytes to minimize the chance that we
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens # write the same value that's already there.
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens #
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must eval "dd if=/dev/random of=$file conv=notrunc " \
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens "bs=1 count=2 oseek=$offset >/dev/null 2>&1"
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens else
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must truncate -s $offset $file
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens fi
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens}
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# Diff the send/receive filesystems
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# $1 The sent filesystem
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# $2 The received filesystem
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrensfunction file_check
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens{
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens sendfs=$1
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens recvfs=$2
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens if [[ -d /$recvfs/.zfs/snapshot/a && -d \
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens /$sendfs/.zfs/snapshot/a ]]; then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy diff -r /$recvfs/.zfs/snapshot/a /$sendfs/.zfs/snapshot/a
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens [[ $? -eq 0 ]] || log_fail "Differences found in snap a"
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens fi
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens if [[ -d /$recvfs/.zfs/snapshot/b && -d \
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens /$sendfs/.zfs/snapshot/b ]]; then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy diff -r /$recvfs/.zfs/snapshot/b /$sendfs/.zfs/snapshot/b
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens [[ $? -eq 0 ]] || log_fail "Differences found in snap b"
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens fi
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens}
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# Resume test helper
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# $1 The ZFS send command
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# $2 The filesystem where the streams are sent
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# $3 The receive filesystem
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrensfunction resume_test
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens{
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens sendcmd=$1
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens streamfs=$2
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens recvfs=$3
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens stream_num=1
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens log_must eval "$sendcmd >/$streamfs/$stream_num"
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens for ((i=0; i<2; i=i+1)); do
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens mess_file /$streamfs/$stream_num
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy log_mustnot zfs recv -suv $recvfs </$streamfs/$stream_num
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens stream_num=$((stream_num+1))
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy token=$(zfs get -Hp -o value receive_resume_token $recvfs)
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must eval "zfs send -v -t $token >/$streamfs/$stream_num"
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens [[ -f /$streamfs/$stream_num ]] || \
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens log_fail "NO FILE /$streamfs/$stream_num"
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens done
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy log_must zfs recv -suv $recvfs </$streamfs/$stream_num
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens}
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens# Setup filesystems for the resumable send/receive tests
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy# $1 The "send" filesystem
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy# $2 The "recv" filesystem
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens#
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrensfunction test_fs_setup
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens{
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy typeset sendfs=$1
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy typeset recvfs=$2
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy typeset sendpool=${sendfs%%/*}
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy typeset recvpool=${recvfs%%/*}
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel datasetexists $sendfs && log_must zfs destroy -r $sendpool
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel datasetexists $recvfs && log_must zfs destroy -r $recvpool
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
ac89d1e83d4735655102d06f099fb2d21bf120f6John Kennedy if $(datasetexists $sendfs || zfs create -o compress=lz4 $sendfs); then
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens mk_files 1000 256 0 $sendfs &
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens mk_files 1000 131072 0 $sendfs &
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens mk_files 100 1048576 0 $sendfs &
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens mk_files 10 10485760 0 $sendfs &
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens mk_files 1 104857600 0 $sendfs &
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must wait
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs snapshot $sendfs@a
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens rm_files 200 256 0 $sendfs &
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens rm_files 200 131072 0 $sendfs &
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens rm_files 20 1048576 0 $sendfs &
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens rm_files 2 10485760 0 $sendfs &
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must wait
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens mk_files 400 256 0 $sendfs &
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens mk_files 400 131072 0 $sendfs &
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens mk_files 40 1048576 0 $sendfs &
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens mk_files 4 10485760 0 $sendfs &
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must wait
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs snapshot $sendfs@b
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must eval "zfs send -v $sendfs@a >/$sendpool/initial.zsend"
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must eval "zfs send -v -i @a $sendfs@b " \
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens ">/$sendpool/incremental.zsend"
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens fi
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens if datasetexists $streamfs; then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs destroy -r $streamfs
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens fi
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs create -o compress=lz4 $sendpool/stream
9c3fd1216fa7fb02cfbc78a2518a686d54b48ab8Matthew Ahrens}
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# Check to see if the specified features are set in a send stream.
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# The values for these features are found in uts/common/fs/zfs/sys/zfs_ioctl.h
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# $1 The stream file
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# $2-$n The flags expected in the stream
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelfunction stream_has_features
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel{
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset file=$1
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel shift
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel [[ -f $file ]] || log_fail "Couldn't find file: $file"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset flags=$(cat $file | zstreamdump | awk '/features =/ {print $3}')
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset -A feature
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel feature[dedup]="1"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel feature[dedupprops]="2"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel feature[sa_spill]="4"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel feature[embed_data]="10000"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel feature[lz4]="20000"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel feature[mooch_byteswap]="40000"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel feature[large_blocks]="80000"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel feature[resuming]="100000"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel feature[redacted]="200000"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel feature[compressed]="400000"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset flag known derived=0
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel for flag in "$@"; do
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel known=${feature[$flag]}
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel [[ -z $known ]] && log_fail "Unknown feature: $flag"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel derived=$(echo "$flags & ${feature[$flag]} = X" | mdb | sed 's/ //g')
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel [[ $derived = $known ]] || return 1
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel done
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel return 0
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel}
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# Parse zstreamdump -v output. The output varies for each kind of record:
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# BEGIN records are simply output as "BEGIN"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# END records are output as "END"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# OBJECT records become "OBJECT <object num>"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# FREEOBJECTS records become "FREEOBJECTS <startobj> <numobjs>"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# FREE records become "<record type> <start> <length>"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# WRITE records become:
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# "<record type> <compression type> <start> <logical size> <compressed size>
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# <data size>"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelfunction parse_dump
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel{
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel sed '/^WRITE/{N;s/\n/ /;}' | grep "^[A-Z]" | awk '{
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel if ($1 == "BEGIN" || $1 == "END") print $1
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel if ($1 == "OBJECT") print $1" "$4
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel if ($1 == "FREEOBJECTS") print $1" "$4" "$7
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel if ($1 == "FREE") print $1" "$7" "$10
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel if ($1 == "WRITE") print $1" "$15" "$18" "$21" "$24" "$27}'
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel}
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# Given a send stream, verify that the size of the stream matches what's
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# expected based on the source or target dataset. If the stream is an
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# incremental stream, subtract the size of the source snapshot before
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# comparing. This function does not currently handle incremental streams
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# that remove data.
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# $1 The zstreamdump output file
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# $2 The dataset to compare against
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# This can be a source of a send or recv target (fs, not snapshot)
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# $3 The percentage below which verification is deemed a failure
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# $4 The source snapshot of an incremental send
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelfunction verify_stream_size
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel{
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset stream=$1
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset ds=$2
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset percent=${3:-90}
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset inc_src=$4
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel [[ -f $stream ]] || log_fail "No such file: $stream"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel datasetexists $ds || log_fail "No such dataset: $ds"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset stream_size=$(cat $stream | zstreamdump | sed -n \
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel 's/ Total write size = \(.*\) (0x.*)/\1/p')
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset inc_size=0
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel if [[ -n $inc_src ]]; then
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel inc_size=$(get_prop lrefer $inc_src)
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel if stream_has_features $stream compressed; then
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel inc_size=$(get_prop refer $inc_src)
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel fi
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel fi
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel if stream_has_features $stream compressed; then
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel ds_size=$(get_prop refer $ds)
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel else
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel ds_size=$(get_prop lrefer $ds)
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel fi
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel ds_size=$((ds_size - inc_size))
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel within_percent $stream_size $ds_size $percent || log_fail \
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel "$stream_size $ds_size differed by too much"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel}
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# Cleanup function for tests involving resumable send
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelfunction resume_cleanup
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel{
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset sendfs=$1
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset streamfs=$2
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel datasetexists $sendfs && log_must zfs destroy -r $sendfs
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel datasetexists $streamfs && log_must zfs destroy -r $streamfs
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel cleanup_pool $POOL2
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel rm -f /$POOL/initial.zsend /$POOL/incremental.zsend
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel}