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