1d583b39bSJohn Wren Kennedy#!/bin/ksh
2d583b39bSJohn Wren Kennedy#
3d583b39bSJohn Wren Kennedy# CDDL HEADER START
4d583b39bSJohn Wren Kennedy#
5d583b39bSJohn Wren Kennedy# This file and its contents are supplied under the terms of the
6d583b39bSJohn Wren Kennedy# Common Development and Distribution License ("CDDL"), version 1.0.
7d583b39bSJohn Wren Kennedy# You may only use this file in accordance with the terms of version
8d583b39bSJohn Wren Kennedy# 1.0 of the CDDL.
9d583b39bSJohn Wren Kennedy#
10d583b39bSJohn Wren Kennedy# A full copy of the text of the CDDL should have accompanied this
11d583b39bSJohn Wren Kennedy# source.  A copy of the CDDL is also available via the Internet at
12d583b39bSJohn Wren Kennedy# http://www.illumos.org/license/CDDL.
13d583b39bSJohn Wren Kennedy#
14d583b39bSJohn Wren Kennedy# CDDL HEADER END
15d583b39bSJohn Wren Kennedy#
16d583b39bSJohn Wren Kennedy
17d583b39bSJohn Wren Kennedy#
181d32ba66SJohn Wren Kennedy# Copyright (c) 2012, 2016 by Delphix. All rights reserved.
19d583b39bSJohn Wren Kennedy#
20d583b39bSJohn Wren Kennedy
21d583b39bSJohn Wren Kennedy. $STF_SUITE/include/libtest.shlib
22d583b39bSJohn Wren Kennedy#
23d583b39bSJohn Wren Kennedy# DESCRIPTION:
24d583b39bSJohn Wren Kennedy#	Verify 'zfs send' can generate valid streams with different options
25d583b39bSJohn Wren Kennedy#
26d583b39bSJohn Wren Kennedy# STRATEGY:
27d583b39bSJohn Wren Kennedy#	1. Create datasets
28d583b39bSJohn Wren Kennedy#	2. Write some data to the datasets
29d583b39bSJohn Wren Kennedy#	3. Create a full send streams
30d583b39bSJohn Wren Kennedy#	4. Receive the send stream
31d583b39bSJohn Wren Kennedy#	5. Do a dry run with different options and verify the generated size
32d583b39bSJohn Wren Kennedy#          estimate against the received stream
33d583b39bSJohn Wren Kennedy#
34d583b39bSJohn Wren Kennedy
35d583b39bSJohn Wren Kennedyverify_runnable "both"
36d583b39bSJohn Wren Kennedy
37d583b39bSJohn Wren Kennedyfunction cleanup
38d583b39bSJohn Wren Kennedy{
39*df477c0aSPaul Dagnelie	mdb_set_uint32 zfs_override_estimate_recordsize 8192
40d583b39bSJohn Wren Kennedy	for ds in $datasets; do
411d32ba66SJohn Wren Kennedy                datasetexists $ds && zfs destroy -rf $ds
42d583b39bSJohn Wren Kennedy	done
43d583b39bSJohn Wren Kennedy}
44d583b39bSJohn Wren Kennedy
45d583b39bSJohn Wren Kennedyfunction cal_percentage
46d583b39bSJohn Wren Kennedy{
47d583b39bSJohn Wren Kennedy	typeset value=$1
481d32ba66SJohn Wren Kennedy	return=$(echo "$PERCENT * $value" | bc)
491d32ba66SJohn Wren Kennedy	return=$(echo "$return / 100" | bc)
50d583b39bSJohn Wren Kennedy	echo $return
51d583b39bSJohn Wren Kennedy}
52d583b39bSJohn Wren Kennedy
53d583b39bSJohn Wren Kennedyfunction get_estimate_size
54d583b39bSJohn Wren Kennedy{
55d583b39bSJohn Wren Kennedy	typeset snapshot=$1
56d583b39bSJohn Wren Kennedy	typeset option=$2
57d583b39bSJohn Wren Kennedy	typeset base_snapshot=${3:-""}
58d583b39bSJohn Wren Kennedy	if [[ -z $3 ]];then
591d32ba66SJohn Wren Kennedy		typeset total_size=$(zfs send $option $snapshot 2>&1 | tail -1)
60d583b39bSJohn Wren Kennedy	else
611d32ba66SJohn Wren Kennedy		typeset total_size=$(zfs send $option $base_snapshot $snapshot \
621d32ba66SJohn Wren Kennedy		     2>&1 | tail -1)
63d583b39bSJohn Wren Kennedy	fi
64d583b39bSJohn Wren Kennedy	if [[ $options == *"P"* ]]; then
651d32ba66SJohn Wren Kennedy		total_size=$(echo "$total_size" | awk '{print $2}')
66d583b39bSJohn Wren Kennedy	else
671d32ba66SJohn Wren Kennedy		total_size=$(echo "$total_size" | awk '{print $5}')
68d583b39bSJohn Wren Kennedy		total_size=${total_size%M}
691d32ba66SJohn Wren Kennedy		total_size=$(echo "$total_size * $block_count" | bc)
70d583b39bSJohn Wren Kennedy	fi
711d32ba66SJohn Wren Kennedy	echo $total_size
72d583b39bSJohn Wren Kennedy
73d583b39bSJohn Wren Kennedy}
74d583b39bSJohn Wren Kennedy
75d583b39bSJohn Wren Kennedyfunction verify_size_estimates
76d583b39bSJohn Wren Kennedy{
77d583b39bSJohn Wren Kennedy	typeset options=$1
78d583b39bSJohn Wren Kennedy	typeset file_size=$2
791d32ba66SJohn Wren Kennedy	typeset refer_diff=$(echo "$refer_size - $estimate_size" | bc)
801d32ba66SJohn Wren Kennedy	refer_diff=$(echo "$refer_diff / 1" | bc)
811d32ba66SJohn Wren Kennedy	refer_diff=$(echo "$refer_diff" | nawk '{print ($1 < 0) ? ($1 * -1): $1'})
821d32ba66SJohn Wren Kennedy	typeset file_diff=$(echo "$file_size - $estimate_size" | bc)
831d32ba66SJohn Wren Kennedy	file_diff=$(echo "$file_diff / 1" | bc)
841d32ba66SJohn Wren Kennedy	file_diff=$(echo "$file_diff" | nawk '{print ($1 < 0) ? ($1 * -1):$1'})
85d583b39bSJohn Wren Kennedy	typeset expected_diff=$(cal_percentage $refer_size)
86d583b39bSJohn Wren Kennedy
87d583b39bSJohn Wren Kennedy	[[ -z $refer_diff && -z $file_diff && -z $expected_diff ]] && \
88d583b39bSJohn Wren Kennedy	    log_fail "zfs send $options failed"
89d583b39bSJohn Wren Kennedy	[[ $refer_diff -le $expected_diff &&  \
90d583b39bSJohn Wren Kennedy	    $file_diff -le $expected_diff ]] || \
91d583b39bSJohn Wren Kennedy	    log_fail "zfs send $options gives wrong size estimates"
92d583b39bSJohn Wren Kennedy}
93d583b39bSJohn Wren Kennedy
94d583b39bSJohn Wren Kennedylog_assert "Verify 'zfs send -nvP' generates valid stream estimates"
95d583b39bSJohn Wren Kennedylog_onexit cleanup
96*df477c0aSPaul Dagneliemdb_set_uint32 zfs_override_estimate_recordsize 0
97d583b39bSJohn Wren Kennedytypeset -l block_count=0
98d583b39bSJohn Wren Kennedytypeset -l block_size
99d583b39bSJohn Wren Kennedytypeset -i PERCENT=1
100d583b39bSJohn Wren Kennedy
101d583b39bSJohn Wren Kennedy((block_count=1024*1024))
102d583b39bSJohn Wren Kennedy
103d583b39bSJohn Wren Kennedy# create dataset
1041d32ba66SJohn Wren Kennedylog_must zfs create $TESTPOOL/$TESTFS1
105d583b39bSJohn Wren Kennedy
106d583b39bSJohn Wren Kennedy# create multiple snapshot for the dataset with data
107d583b39bSJohn Wren Kennedyfor block_size in 64 128 256; do
1081d32ba66SJohn Wren Kennedy	log_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS1/file$block_size \
109d583b39bSJohn Wren Kennedy	    bs=1M count=$block_size
1101d32ba66SJohn Wren Kennedy	log_must zfs snapshot $TESTPOOL/$TESTFS1@snap$block_size
111d583b39bSJohn Wren Kennedydone
112d583b39bSJohn Wren Kennedy
113d583b39bSJohn Wren Kennedyfull_snapshot="$TESTPOOL/$TESTFS1@snap64"
114d583b39bSJohn Wren Kennedyincreamental_snapshot="$TESTPOOL/$TESTFS1@snap256"
115d583b39bSJohn Wren Kennedy
1161d32ba66SJohn Wren Kennedyfull_size=$(zfs send $full_snapshot 2>&1 | wc -c)
1171d32ba66SJohn Wren Kennedyincreamental_size=$(zfs send $increamental_snapshot 2>&1 | wc -c)
1181d32ba66SJohn Wren Kennedyincreamental_send=$(zfs send -i $full_snapshot $increamental_snapshot 2>&1 | wc -c)
119d583b39bSJohn Wren Kennedy
120d583b39bSJohn Wren Kennedylog_note "verify zfs send -nv"
121d583b39bSJohn Wren Kennedyoptions="-nv"
122d583b39bSJohn Wren Kennedyrefer_size=$(get_prop refer $full_snapshot)
123d583b39bSJohn Wren Kennedyestimate_size=$(get_estimate_size $full_snapshot $options)
124d583b39bSJohn Wren Kennedylog_must verify_size_estimates $options $full_size
125d583b39bSJohn Wren Kennedy
126d583b39bSJohn Wren Kennedylog_note "verify zfs send -Pnv"
127d583b39bSJohn Wren Kennedyoptions="-Pnv"
128d583b39bSJohn Wren Kennedy
129d583b39bSJohn Wren Kennedyestimate_size=$(get_estimate_size $full_snapshot $options)
130d583b39bSJohn Wren Kennedylog_must verify_size_estimates $options $full_size
131d583b39bSJohn Wren Kennedy
132d583b39bSJohn Wren Kennedylog_note "verify zfs send -nv for multiple snapshot send"
133d583b39bSJohn Wren Kennedyoptions="-nv"
134d583b39bSJohn Wren Kennedyrefer_size=$(get_prop refer $increamental_snapshot)
135d583b39bSJohn Wren Kennedy
136d583b39bSJohn Wren Kennedyestimate_size=$(get_estimate_size $increamental_snapshot $options)
137d583b39bSJohn Wren Kennedylog_must verify_size_estimates $options $increamental_size
138d583b39bSJohn Wren Kennedy
139d583b39bSJohn Wren Kennedylog_note "verify zfs send -vPn for multiple snapshot send"
140d583b39bSJohn Wren Kennedyoptions="-vPn"
141d583b39bSJohn Wren Kennedy
142d583b39bSJohn Wren Kennedyestimate_size=$(get_estimate_size $increamental_snapshot $options)
143d583b39bSJohn Wren Kennedylog_must verify_size_estimates $options $increamental_size
144d583b39bSJohn Wren Kennedy
145d583b39bSJohn Wren Kennedylog_note "verify zfs send -inv for increamental send"
146d583b39bSJohn Wren Kennedyoptions="-nvi"
147d583b39bSJohn Wren Kennedyrefer_size=$(get_prop refer $increamental_snapshot)
148d583b39bSJohn Wren Kennedydeduct_size=$(get_prop refer $full_snapshot)
1491d32ba66SJohn Wren Kennedyrefer_size=$(echo "$refer_size - $deduct_size" | bc)
150d583b39bSJohn Wren Kennedy
151d583b39bSJohn Wren Kennedyestimate_size=$(get_estimate_size $increamental_snapshot $options $full_snapshot)
152d583b39bSJohn Wren Kennedylog_must verify_size_estimates $options $increamental_send
153d583b39bSJohn Wren Kennedy
154d583b39bSJohn Wren Kennedylog_note "verify zfs send -ivPn for increamental send"
155d583b39bSJohn Wren Kennedyoptions="-vPni"
156d583b39bSJohn Wren Kennedy
157d583b39bSJohn Wren Kennedyestimate_size=$(get_estimate_size $increamental_snapshot $options $full_snapshot)
158d583b39bSJohn Wren Kennedylog_must verify_size_estimates $options $increamental_send
159d583b39bSJohn Wren Kennedy
1601d32ba66SJohn Wren Kennedylog_must zfs destroy -r $TESTPOOL/$TESTFS1
161d583b39bSJohn Wren Kennedy
162d583b39bSJohn Wren Kennedy#setup_recursive_send
163d583b39bSJohn Wren Kennedydatasets="$TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS2
164d583b39bSJohn Wren Kennedy    $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3"
165d583b39bSJohn Wren Kennedy# create nested datasets
1661d32ba66SJohn Wren Kennedylog_must zfs create -p $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3
167d583b39bSJohn Wren Kennedy
168d583b39bSJohn Wren Kennedy# verify dataset creation
169d583b39bSJohn Wren Kennedyfor ds in $datasets; do
170d583b39bSJohn Wren Kennedy        datasetexists $ds || log_fail "Create $ds dataset fail."
171d583b39bSJohn Wren Kennedydone
172d583b39bSJohn Wren Kennedyfor ds in $datasets; do
1731d32ba66SJohn Wren Kennedy	log_must dd if=/dev/urandom of=/$ds/file64 \
174d583b39bSJohn Wren Kennedy	    bs=1M count=64
175d583b39bSJohn Wren Kennedydone
176d583b39bSJohn Wren Kennedy
177d583b39bSJohn Wren Kennedy# create recursive nested snapshot
1781d32ba66SJohn Wren Kennedylog_must zfs snapshot -r $TESTPOOL/$TESTFS1@snap64
179d583b39bSJohn Wren Kennedyfor ds in $datasets; do
180d583b39bSJohn Wren Kennedy        datasetexists $ds@snap64 || log_fail "Create $ds@snap64 snapshot fail."
181d583b39bSJohn Wren Kennedydone
1821d32ba66SJohn Wren Kennedyrecursive_size=$(zfs send -R $full_snapshot 2>&1 | wc -c)
183d583b39bSJohn Wren Kennedylog_note "verify zfs send -Rnv for recursive send"
184d583b39bSJohn Wren Kennedyoptions="-Rnv"
185d583b39bSJohn Wren Kennedyrefer_size=$(get_prop refer $full_snapshot)
1861d32ba66SJohn Wren Kennedyrefer_size=$(echo "$refer_size * 3" | bc)
187d583b39bSJohn Wren Kennedy
188d583b39bSJohn Wren Kennedyestimate_size=$(get_estimate_size $full_snapshot $options)
189d583b39bSJohn Wren Kennedylog_must verify_size_estimates $options $recursive_size
190d583b39bSJohn Wren Kennedy
191d583b39bSJohn Wren Kennedylog_note "verify zfs send -RvPn for recursive send"
192d583b39bSJohn Wren Kennedyoptions="-RvPn"
193d583b39bSJohn Wren Kennedyestimate_size=$(get_estimate_size $full_snapshot $options)
194d583b39bSJohn Wren Kennedylog_must verify_size_estimates $options $recursive_size
195d583b39bSJohn Wren Kennedy
196d583b39bSJohn Wren Kennedylog_pass "'zfs send' prints the correct size estimates using '-n' and '-P' options."
197