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