1*5602294fSDan Kimmel#!/usr/bin/ksh 2*5602294fSDan Kimmel 3*5602294fSDan Kimmel# 4*5602294fSDan Kimmel# This file and its contents are supplied under the terms of the 5*5602294fSDan Kimmel# Common Development and Distribution License ("CDDL"), version 1.0. 6*5602294fSDan Kimmel# You may only use this file in accordance with the terms of version 7*5602294fSDan Kimmel# 1.0 of the CDDL. 8*5602294fSDan Kimmel# 9*5602294fSDan Kimmel# A full copy of the text of the CDDL should have accompanied this 10*5602294fSDan Kimmel# source. A copy of the CDDL is also available via the Internet at 11*5602294fSDan Kimmel# http://www.illumos.org/license/CDDL. 12*5602294fSDan Kimmel# 13*5602294fSDan Kimmel 14*5602294fSDan Kimmel# 15*5602294fSDan Kimmel# Copyright (c) 2015 by Delphix. All rights reserved. 16*5602294fSDan Kimmel# 17*5602294fSDan Kimmel 18*5602294fSDan Kimmel. $STF_SUITE/tests/functional/rsend/rsend.kshlib 19*5602294fSDan Kimmel. $STF_SUITE/include/properties.shlib 20*5602294fSDan Kimmel 21*5602294fSDan Kimmel# 22*5602294fSDan Kimmel# Description: 23*5602294fSDan Kimmel# Verify that compressed streams can contain embedded blocks. 24*5602294fSDan Kimmel# 25*5602294fSDan Kimmel# Strategy: 26*5602294fSDan Kimmel# 1. Create a filesystem with compressible data and embedded blocks. 27*5602294fSDan Kimmel# 2. Verify the created streams can be received correctly. 28*5602294fSDan Kimmel# 3. Verify the presence / absence of embedded blocks in the compressed stream, 29*5602294fSDan Kimmel# as well as the receiving file system. 30*5602294fSDan Kimmel# 31*5602294fSDan Kimmel 32*5602294fSDan Kimmelverify_runnable "both" 33*5602294fSDan Kimmel 34*5602294fSDan Kimmellog_assert "Verify that compressed streams can contain embedded blocks." 35*5602294fSDan Kimmellog_onexit cleanup_pool $POOL2 36*5602294fSDan Kimmel 37*5602294fSDan Kimmeltypeset objs obj recsize 38*5602294fSDan Kimmeltypeset sendfs=$POOL2/sendfs 39*5602294fSDan Kimmeltypeset recvfs=$POOL2/recvfs 40*5602294fSDan Kimmeltypeset stream=$BACKDIR/stream 41*5602294fSDan Kimmeltypeset dump=$BACKDIR/dump 42*5602294fSDan Kimmeltypeset recvfs2=$POOL2/recvfs2 43*5602294fSDan Kimmeltypeset stream2=$BACKDIR/stream2 44*5602294fSDan Kimmeltypeset dump2=$BACKDIR/dump2 45*5602294fSDan Kimmellog_must zfs create -o compress=lz4 $sendfs 46*5602294fSDan Kimmellog_must zfs create -o compress=lz4 $recvfs 47*5602294fSDan Kimmellog_must zfs create -o compress=lz4 $recvfs2 48*5602294fSDan Kimmeltypeset dir=$(get_prop mountpoint $sendfs) 49*5602294fSDan Kimmel 50*5602294fSDan Kimmel# Populate the send dataset with compressible data and embedded block files. 51*5602294fSDan Kimmelwrite_compressible $dir 16m 52*5602294fSDan Kimmelfor recsize in "${recsize_prop_vals[@]}"; do 53*5602294fSDan Kimmel # For lz4, this method works for blocks up to 16k, but not larger 54*5602294fSDan Kimmel [[ $recsize -eq $((32 * 1024)) ]] && break 55*5602294fSDan Kimmel 56*5602294fSDan Kimmel log_must mkholes -h 0:$((recsize - 8)) -d $((recsize - 8)):8 \ 57*5602294fSDan Kimmel $dir/$recsize 58*5602294fSDan Kimmeldone 59*5602294fSDan Kimmel 60*5602294fSDan Kimmel# Generate the streams and zstreamdump output. 61*5602294fSDan Kimmellog_must zfs snapshot $sendfs@now 62*5602294fSDan Kimmellog_must eval "zfs send -c $sendfs@now >$stream" 63*5602294fSDan Kimmellog_must eval "zstreamdump -v <$stream >$dump" 64*5602294fSDan Kimmellog_must eval "zfs recv -d $recvfs <$stream" 65*5602294fSDan Kimmelcmp_ds_cont $sendfs $recvfs 66*5602294fSDan Kimmelverify_stream_size $stream $sendfs 67*5602294fSDan Kimmellog_mustnot stream_has_features $stream embed_data 68*5602294fSDan Kimmel 69*5602294fSDan Kimmellog_must eval "zfs send -c -e $sendfs@now >$stream2" 70*5602294fSDan Kimmellog_must eval "zstreamdump -v <$stream2 >$dump2" 71*5602294fSDan Kimmellog_must eval "zfs recv -d $recvfs2 <$stream2" 72*5602294fSDan Kimmelcmp_ds_cont $sendfs $recvfs2 73*5602294fSDan Kimmelverify_stream_size $stream2 $sendfs 74*5602294fSDan Kimmellog_must stream_has_features $stream2 embed_data 75*5602294fSDan Kimmel 76*5602294fSDan Kimmel# Verify embedded blocks are present only when expected. 77*5602294fSDan Kimmelfor recsize in "${recsize_prop_vals[@]}"; do 78*5602294fSDan Kimmel [[ $recsize -eq $((32 * 1024)) ]] && break 79*5602294fSDan Kimmel 80*5602294fSDan Kimmel typeset send_obj=$(get_objnum $(get_prop mountpoint $sendfs)/$recsize) 81*5602294fSDan Kimmel typeset recv_obj=$(get_objnum \ 82*5602294fSDan Kimmel $(get_prop mountpoint $recvfs/sendfs)/$recsize) 83*5602294fSDan Kimmel typeset recv2_obj=$(get_objnum \ 84*5602294fSDan Kimmel $(get_prop mountpoint $recvfs2/sendfs)/$recsize) 85*5602294fSDan Kimmel 86*5602294fSDan Kimmel log_must eval "zdb -ddddd $sendfs $send_obj >$BACKDIR/sendfs.zdb" 87*5602294fSDan Kimmel log_must eval "zdb -ddddd $recvfs/sendfs $recv_obj >$BACKDIR/recvfs.zdb" 88*5602294fSDan Kimmel log_must eval "zdb -ddddd $recvfs2/sendfs $recv2_obj >$BACKDIR/recvfs2.zdb" 89*5602294fSDan Kimmel 90*5602294fSDan Kimmel grep -q "EMBEDDED" $BACKDIR/sendfs.zdb || \ 91*5602294fSDan Kimmel log_fail "Obj $send_obj not embedded in $sendfs" 92*5602294fSDan Kimmel grep -q "EMBEDDED" $BACKDIR/recvfs.zdb || \ 93*5602294fSDan Kimmel log_fail "Obj $recv_obj not embedded in $recvfs" 94*5602294fSDan Kimmel grep -q "EMBEDDED" $BACKDIR/recvfs2.zdb || \ 95*5602294fSDan Kimmel log_fail "Obj $recv2_obj not embedded in $recvfs2" 96*5602294fSDan Kimmel 97*5602294fSDan Kimmel grep -q "WRITE_EMBEDDED object = $send_obj offset = 0" $dump && \ 98*5602294fSDan Kimmel log_fail "Obj $obj embedded in zstreamdump output" 99*5602294fSDan Kimmel grep -q "WRITE_EMBEDDED object = $send_obj offset = 0" $dump2 || \ 100*5602294fSDan Kimmel log_fail "Obj $obj not embedded in zstreamdump output" 101*5602294fSDan Kimmeldone 102*5602294fSDan Kimmel 103*5602294fSDan Kimmellog_pass "Compressed streams can contain embedded blocks." 104