d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#!/bin/ksh
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# CDDL HEADER START
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# This file and its contents are supplied under the terms of the
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# Common Development and Distribution License ("CDDL"), version 1.0.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# You may only use this file in accordance with the terms of version
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# 1.0 of the CDDL.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# A full copy of the text of the CDDL should have accompanied this
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# source. A copy of the CDDL is also available via the Internet at
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# http://www.illumos.org/license/CDDL.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# CDDL HEADER END
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy# Copyright (c) 2012, 2016 by Delphix. All rights reserved.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy. $STF_SUITE/include/libtest.shlib
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# DESCRIPTION:
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# Verify 'zfs send' can generate valid streams with different options
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# STRATEGY:
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# 1. Create datasets
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# 2. Write some data to the datasets
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# 3. Create a full send streams
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# 4. Receive the send stream
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# 5. Do a dry run with different options and verify the generated size
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# estimate against the received stream
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyverify_runnable "both"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyfunction cleanup
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy{
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy for ds in $datasets; do
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy datasetexists $ds && zfs destroy -rf $ds
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy done
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy}
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyfunction cal_percentage
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy{
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy typeset value=$1
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy return=$(echo "$PERCENT * $value" | bc)
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy return=$(echo "$return / 100" | bc)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy echo $return
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy}
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyfunction get_estimate_size
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy{
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy typeset snapshot=$1
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy typeset option=$2
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy typeset base_snapshot=${3:-""}
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy if [[ -z $3 ]];then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy typeset total_size=$(zfs send $option $snapshot 2>&1 | tail -1)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy else
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy typeset total_size=$(zfs send $option $base_snapshot $snapshot \
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy 2>&1 | tail -1)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy fi
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy if [[ $options == *"P"* ]]; then
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy total_size=$(echo "$total_size" | awk '{print $2}')
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy else
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy total_size=$(echo "$total_size" | awk '{print $5}')
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy total_size=${total_size%M}
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy total_size=$(echo "$total_size * $block_count" | bc)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy fi
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy echo $total_size
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy}
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyfunction verify_size_estimates
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy{
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy typeset options=$1
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy typeset file_size=$2
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy typeset refer_diff=$(echo "$refer_size - $estimate_size" | bc)
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy refer_diff=$(echo "$refer_diff / 1" | bc)
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy refer_diff=$(echo "$refer_diff" | nawk '{print ($1 < 0) ? ($1 * -1): $1'})
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy typeset file_diff=$(echo "$file_size - $estimate_size" | bc)
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy file_diff=$(echo "$file_diff / 1" | bc)
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy file_diff=$(echo "$file_diff" | nawk '{print ($1 < 0) ? ($1 * -1):$1'})
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy typeset expected_diff=$(cal_percentage $refer_size)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy [[ -z $refer_diff && -z $file_diff && -z $expected_diff ]] && \
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy log_fail "zfs send $options failed"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy [[ $refer_diff -le $expected_diff && \
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy $file_diff -le $expected_diff ]] || \
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy log_fail "zfs send $options gives wrong size estimates"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy}
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_assert "Verify 'zfs send -nvP' generates valid stream estimates"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_onexit cleanup
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedytypeset -l block_count=0
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedytypeset -l block_size
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedytypeset -i PERCENT=1
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy((block_count=1024*1024))
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# create dataset
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedylog_must zfs create $TESTPOOL/$TESTFS1
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# create multiple snapshot for the dataset with data
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyfor block_size in 64 128 256; do
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS1/file$block_size \
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy bs=1M count=$block_size
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must zfs snapshot $TESTPOOL/$TESTFS1@snap$block_size
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedydone
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyfull_snapshot="$TESTPOOL/$TESTFS1@snap64"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyincreamental_snapshot="$TESTPOOL/$TESTFS1@snap256"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedyfull_size=$(zfs send $full_snapshot 2>&1 | wc -c)
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedyincreamental_size=$(zfs send $increamental_snapshot 2>&1 | wc -c)
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedyincreamental_send=$(zfs send -i $full_snapshot $increamental_snapshot 2>&1 | wc -c)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_note "verify zfs send -nv"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyoptions="-nv"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyrefer_size=$(get_prop refer $full_snapshot)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyestimate_size=$(get_estimate_size $full_snapshot $options)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_must verify_size_estimates $options $full_size
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_note "verify zfs send -Pnv"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyoptions="-Pnv"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyestimate_size=$(get_estimate_size $full_snapshot $options)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_must verify_size_estimates $options $full_size
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_note "verify zfs send -nv for multiple snapshot send"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyoptions="-nv"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyrefer_size=$(get_prop refer $increamental_snapshot)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyestimate_size=$(get_estimate_size $increamental_snapshot $options)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_must verify_size_estimates $options $increamental_size
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_note "verify zfs send -vPn for multiple snapshot send"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyoptions="-vPn"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyestimate_size=$(get_estimate_size $increamental_snapshot $options)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_must verify_size_estimates $options $increamental_size
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_note "verify zfs send -inv for increamental send"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyoptions="-nvi"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyrefer_size=$(get_prop refer $increamental_snapshot)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedydeduct_size=$(get_prop refer $full_snapshot)
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedyrefer_size=$(echo "$refer_size - $deduct_size" | bc)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyestimate_size=$(get_estimate_size $increamental_snapshot $options $full_snapshot)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_must verify_size_estimates $options $increamental_send
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_note "verify zfs send -ivPn for increamental send"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyoptions="-vPni"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyestimate_size=$(get_estimate_size $increamental_snapshot $options $full_snapshot)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_must verify_size_estimates $options $increamental_send
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedylog_must zfs destroy -r $TESTPOOL/$TESTFS1
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#setup_recursive_send
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedydatasets="$TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS2
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# create nested datasets
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedylog_must zfs create -p $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# verify dataset creation
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyfor ds in $datasets; do
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy datasetexists $ds || log_fail "Create $ds dataset fail."
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedydone
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyfor ds in $datasets; do
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy log_must dd if=/dev/urandom of=/$ds/file64 \
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy bs=1M count=64
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedydone
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy# create recursive nested snapshot
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedylog_must zfs snapshot -r $TESTPOOL/$TESTFS1@snap64
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyfor ds in $datasets; do
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy datasetexists $ds@snap64 || log_fail "Create $ds@snap64 snapshot fail."
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedydone
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedyrecursive_size=$(zfs send -R $full_snapshot 2>&1 | wc -c)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_note "verify zfs send -Rnv for recursive send"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyoptions="-Rnv"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyrefer_size=$(get_prop refer $full_snapshot)
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedyrefer_size=$(echo "$refer_size * 3" | bc)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyestimate_size=$(get_estimate_size $full_snapshot $options)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_must verify_size_estimates $options $recursive_size
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_note "verify zfs send -RvPn for recursive send"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyoptions="-RvPn"
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyestimate_size=$(get_estimate_size $full_snapshot $options)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_must verify_size_estimates $options $recursive_size
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedylog_pass "'zfs send' prints the correct size estimates using '-n' and '-P' options."