5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#!/usr/bin/ksh
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# This file and its contents are supplied under the terms of the
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# Common Development and Distribution License ("CDDL"), version 1.0.
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# You may only use this file in accordance with the terms of version
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# 1.0 of the CDDL.
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# A full copy of the text of the CDDL should have accompanied this
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# source. A copy of the CDDL is also available via the Internet at
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# http://www.illumos.org/license/CDDL.
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# Copyright (c) 2015 by Delphix. All rights reserved.
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel. $STF_SUITE/tests/functional/rsend/rsend.kshlib
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# Description:
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# Verify compressed send works correctly with datasets of varying recsize.
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# Strategy:
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# 1. Check the recv behavior (into pools with features enabled and disabled)
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# of all combinations of -c -p and -L. Verify the stream is compressed,
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# and that the recsize property and that of a received file is correct
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# according to this matrix:
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# +---------+--------+------------+------------+-----------+-----------+
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | send | send | received | received | received | received |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | stream | stream | file bs | prop | file bs | props |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | recsize | flags | (disabled) | (disabled) | (enabled) | (enabled) |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# +---------+--------+------------+------------+-----------+-----------+
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | 128k | | 128k | 128k | 128k | 128k |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | 128k | -c | Fails | Fails | 128k | 128k |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | 128k | -p | 128k | 128k | 128k | 128k |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | 128k | -L | 128k | 128k | 128k | 128k |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | 128k | -cp | Fails | Fails | 128k | 128k |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | 128k | -cL | Fails | Fails | 128k | 128k |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | 128k | -pL | 128k | 128k | 128k | 128k |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | 128k | -cpL | Fails | Fails | 128k | 128k |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | 1m | | Fails | Fails | 128k | 128k |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | 1m | -c | Fails | Fails | 128k | 128k |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | 1m | -p | 128k | 128k | 128k | 1m |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | 1m | -L | Fails | Fails | 1m | 128k |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | 1m | -cp | Fails | Fails | 128k | 1m |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | 1m | -cL | Fails | Fails | 1m | 128k |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | 1m | -pL | Fails | Fails | 1m | 1m |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# | 1m | -cpL | Fails | Fails | 1m | 1m |
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# +---------+--------+------------+------------+-----------+-----------+
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelverify_runnable "both"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelfunction cleanup
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel{
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel datasetexists $TESTPOOL/128k && log_must zfs destroy $TESTPOOL/128k
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel datasetexists $TESTPOOL/1m && log_must zfs destroy $TESTPOOL/1m
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel cleanup_pool $POOL2
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel destroy_pool $POOL3
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel}
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# For a received stream, verify the recsize (prop and file) match expectations.
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelfunction check_recsize
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel{
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset recv_ds=$1
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset expected_file_bs=$2
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset expected_recsize=$3
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset file="$(get_prop mountpoint $recv_ds)/testfile"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel [[ -f $file ]] || log_fail "file '$file' doesn't exist"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset read_recsize=$(get_prop recsize $recv_ds)
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset read_file_bs=$(stat $file | sed -n \
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel 's/.*IO Block: \([0-9]*\).*/\1/p')
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel [[ $read_recsize = $expected_recsize ]] || log_fail \
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel "read_recsize: $read_recsize expected_recsize: $expected_recsize"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel [[ $read_file_bs = $expected_file_bs ]] || log_fail \
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel "read_file_bs: $read_file_bs expected_file_bs: $expected_file_bs"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel}
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# This function does a zfs send and receive according to the parameters
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# below, and verifies the data shown in the strategy section.
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# -[cpL] flags to pass through to 'zfs send'
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# -d Receive into a pool with all features disabled
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# $1 The recordsize of the send dataset
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# $2 Whether or not the recv should work.
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# $3 The blocksize expected in a received file (default 128k)
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# $4 The recordsize property expected in a received dataset (default 128k)
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel#
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelfunction check
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel{
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset recv_pool=$POOL2
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset flags='-'
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel while getopts "cdpL" opt; do
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel case $opt in
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel c)
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel flags+='c'
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel ;;
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel d)
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel recv_pool=$POOL3
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel ;;
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel p)
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel flags+='p'
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel ;;
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel L)
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel flags+='L'
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel ;;
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel esac
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel done
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel shift $(($OPTIND - 1))
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel [[ ${#flags} -eq 1 ]] && flags=''
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset recsize=$1
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset verify=$2
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset expected_file_bs=${3-131072}
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset expected_recsize=${4-131072}
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset send_ds=$TESTPOOL/$recsize
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset send_snap=$send_ds@snap
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset recv_ds=$recv_pool/$recsize
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset stream=$BACKDIR/stream.out
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel datasetexists $send_ds || log_fail "send ds: $send_ds doesn't exist"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel [[ -f $stream ]] && log_must rm $stream
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel log_must eval "zfs send $flags $send_snap >$stream"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel $verify eval "zfs recv $recv_ds <$stream"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset stream_size=$(cat $stream | zstreamdump | sed -n \
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel 's/ Total write size = \(.*\) (0x.*)/\1/p')
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel #
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel # Special case: For a send dataset with large blocks, don't try to
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel # verify the stream size is correct if the compress flag is present
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel # but the large blocks flag isn't. In these cases, the user data
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel # isn't compressed in the stream (though metadata is) so the
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel # verification would fail.
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel #
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel typeset do_size_test=true
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel [[ $recsize = $large && $flags =~ 'c' && ! $flags =~ 'L' ]] && \
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel do_size_test=false
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel $do_size_test && verify_stream_size $stream $send_ds
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel if [[ $verify = "log_mustnot" ]]; then
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel datasetnonexists $recv_ds || log_fail "$recv_ds shouldn't exist"
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel return
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel fi
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel check_recsize $recv_ds $expected_file_bs $expected_recsize
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel $do_size_test && verify_stream_size $stream $recv_ds
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel log_must zfs destroy -r $recv_ds
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel}
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmellog_assert "Verify compressed send works with datasets of varying recsize."
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmellog_onexit cleanup
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmeltypeset recsize opts dir
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmeltypeset small=$((128 * 1024))
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmeltypeset large=$((1024 * 1024))
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# Create POOL3 with features disabled and datasets to create test send streams
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmellog_must zpool create -d $POOL3 $DISK3
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelwrite_compressible $BACKDIR 32m
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelfor recsize in $small $large; do
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel log_must zfs create -o compress=gzip -o recsize=$recsize \
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel $TESTPOOL/$recsize
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel dir=$(get_prop mountpoint $TESTPOOL/$recsize)
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel log_must cp $BACKDIR/file.0 $dir/testfile
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel log_must zfs snapshot $TESTPOOL/$recsize@snap
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmeldone
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# Run tests for send streams without large blocks
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelfor opts in '' -d -c -p -dp -L -dL -cp -cL -pL -dpL -cpL; do
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel check $opts $small log_must
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmeldone
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelfor opts in -dc -dcp -dcL -dcpL; do
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel check $opts $small log_mustnot
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmeldone
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel# Run tests for send streams with large blocks
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelfor opts in '' -d -dp -c; do
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel check $opts $large log_must
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmeldone
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelfor opts in -dc -dL -dcp -dcL -dpL -dcpL; do
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel check $opts $large log_mustnot
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmeldone
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelcheck -p $large log_must $small $large
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelcheck -L $large log_must $large $small
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelcheck -cp $large log_must $small $large
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelcheck -cL $large log_must $large $small
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelcheck -pL $large log_must $large $large
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmelcheck -cpL $large log_must $large $large
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmel
5602294fda888d923d57a78bafdaf48ae6223deaDan Kimmellog_pass "Compressed send works with datasets of varying recsize."