1d583b39bSJohn Wren Kennedy# !/bin/ksh
2d583b39bSJohn Wren Kennedy#
3d583b39bSJohn Wren Kennedy# This file and its contents are supplied under the terms of the
4d583b39bSJohn Wren Kennedy# Common Development and Distribution License ("CDDL"), version 1.0.
5d583b39bSJohn Wren Kennedy# You may only use this file in accordance with the terms of version
6d583b39bSJohn Wren Kennedy# 1.0 of the CDDL.
7d583b39bSJohn Wren Kennedy#
8d583b39bSJohn Wren Kennedy# A full copy of the text of the CDDL should have accompanied this
9d583b39bSJohn Wren Kennedy# source.  A copy of the CDDL is also available via the Internet at
10d583b39bSJohn Wren Kennedy# http://www.illumos.org/license/CDDL.
11d583b39bSJohn Wren Kennedy#
12d583b39bSJohn Wren Kennedy
13d583b39bSJohn Wren Kennedy#
14*dadf5efdSBill Sommerfeld# Copyright (c) 2012, 2017 by Delphix. All rights reserved.
15d583b39bSJohn Wren Kennedy#
16d583b39bSJohn Wren Kennedy
17d583b39bSJohn Wren Kennedy#
18d583b39bSJohn Wren Kennedy# DESCRIPTION
19d583b39bSJohn Wren Kennedy# Verify that "zfs list" gives correct values for written and written@
20d583b39bSJohn Wren Kennedy# proerties for the dataset when different operations are on done on it
21d583b39bSJohn Wren Kennedy#
22d583b39bSJohn Wren Kennedy#
23d583b39bSJohn Wren Kennedy# STRATEGY
24d583b39bSJohn Wren Kennedy# 1) Create recursive datasets
25d583b39bSJohn Wren Kennedy# 2) Take snapshots, write data and verify  written/ written@ properties for
26d583b39bSJohn Wren Kennedy#    following cases
27d583b39bSJohn Wren Kennedy#    a) Delete data
28d583b39bSJohn Wren Kennedy#    b) Write Data
29d583b39bSJohn Wren Kennedy#    c) Clone
30d583b39bSJohn Wren Kennedy#    d) Delete snapshot
31d583b39bSJohn Wren Kennedy#    e) Recursive datasets
32d583b39bSJohn Wren Kennedy
33d583b39bSJohn Wren Kennedy. $STF_SUITE/include/libtest.shlib
34d583b39bSJohn Wren Kennedy. $STF_SUITE/include/math.shlib
35d583b39bSJohn Wren Kennedy
36d583b39bSJohn Wren Kennedyfunction cleanup
37d583b39bSJohn Wren Kennedy{
38d583b39bSJohn Wren Kennedy	for ds in $datasets; do
391d32ba66SJohn Wren Kennedy		datasetexists $ds && log_must zfs destroy -R $TESTPOOL/$TESTFS1
40d583b39bSJohn Wren Kennedy	done
41d583b39bSJohn Wren Kennedy}
42d583b39bSJohn Wren Kennedyfunction get_prop_mb
43d583b39bSJohn Wren Kennedy{
44d583b39bSJohn Wren Kennedy	typeset prop=$1
45d583b39bSJohn Wren Kennedy	typeset dataset=$2
46d583b39bSJohn Wren Kennedy	typeset -l value=$(get_prop $prop $dataset)
47d583b39bSJohn Wren Kennedy	((value = value / mb_block))
481d32ba66SJohn Wren Kennedy	echo $value
49d583b39bSJohn Wren Kennedy}
50d583b39bSJohn Wren Kennedy
51d583b39bSJohn Wren Kennedydatasets="$TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS2 \
52d583b39bSJohn Wren Kennedy    $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3"
53d583b39bSJohn Wren Kennedy
54d583b39bSJohn Wren Kennedylog_assert "verify zfs written and written@ property"
55d583b39bSJohn Wren Kennedylog_onexit cleanup
56d583b39bSJohn Wren Kennedy
57d583b39bSJohn Wren Kennedytypeset -l i=1
58d583b39bSJohn Wren Kennedytypeset -l blocks=50
59d583b39bSJohn Wren Kennedytypeset -l expected_written=0
60d583b39bSJohn Wren Kennedytypeset -l expected_writtenat=0
61d583b39bSJohn Wren Kennedytypeset -l written=0
62d583b39bSJohn Wren Kennedytypeset -l total=0
63d583b39bSJohn Wren Kennedytypeset -l snap1_size=0
64d583b39bSJohn Wren Kennedytypeset -l snap2_size=0
65d583b39bSJohn Wren Kennedytypeset -l snap3_size=0
66d583b39bSJohn Wren Kennedytypeset -l mb_block=0
67d583b39bSJohn Wren Kennedy((mb_block = 1024 * 1024))
68d583b39bSJohn Wren Kennedy
69d583b39bSJohn Wren Kennedylog_note "verify written property statistics for dataset"
701d32ba66SJohn Wren Kennedylog_must zfs create -p $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3
71d583b39bSJohn Wren Kennedyfor i in 1 2 3; do
721d32ba66SJohn Wren Kennedy	log_must zfs snapshot $TESTPOOL/$TESTFS1@snap$i
731d32ba66SJohn Wren Kennedy	log_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS1/testfile.$i bs=1M \
74d583b39bSJohn Wren Kennedy	    count=$blocks
751d32ba66SJohn Wren Kennedy	log_must sync
76d583b39bSJohn Wren Kennedy	written=$(get_prop written $TESTPOOL/$TESTFS1)
77d583b39bSJohn Wren Kennedy	((expected_written=blocks * mb_block))
78*dadf5efdSBill Sommerfeld	within_percent $written $expected_written 99.0 || \
79d583b39bSJohn Wren Kennedy	    log_fail "Unexpected written value $written $expected_written"
80d583b39bSJohn Wren Kennedy	((total = total + blocks))
81d583b39bSJohn Wren Kennedy	((blocks = blocks + 50))
82d583b39bSJohn Wren Kennedydone
83d583b39bSJohn Wren Kennedy
84d583b39bSJohn Wren Kennedylog_note "verify written property statistics for snapshots"
85d583b39bSJohn Wren Kennedyblocks=0
86d583b39bSJohn Wren Kennedyfor i in 1 2 3; do
87d583b39bSJohn Wren Kennedy	written=$(get_prop written $TESTPOOL/$TESTFS1@snap$i)
88d583b39bSJohn Wren Kennedy	if [[ $blocks -eq 0 ]]; then
8948cb8b97SAkash Ayare		# Written value for the frist non-clone snapshot is
9048cb8b97SAkash Ayare		# expected to be equal to the referenced value.
9148cb8b97SAkash Ayare		expected_written=$( \
9248cb8b97SAkash Ayare		    get_prop referenced $TESTPOOL/$TESTFS1@snap$i)
93d583b39bSJohn Wren Kennedy	else
94d583b39bSJohn Wren Kennedy		((expected_written = blocks * mb_block))
95d583b39bSJohn Wren Kennedy	fi
96*dadf5efdSBill Sommerfeld	within_percent $written $expected_written 99.0 || \
97d583b39bSJohn Wren Kennedy	    log_fail "Unexpected written value $written $expected_written $i"
98d583b39bSJohn Wren Kennedy	((blocks = blocks + 50))
99d583b39bSJohn Wren Kennedydone
100d583b39bSJohn Wren Kennedy
101d583b39bSJohn Wren Kennedysnap1_size=$total
102d583b39bSJohn Wren Kennedy((snap2_size = total-50))
103d583b39bSJohn Wren Kennedy((snap3_size = total-100))
104d583b39bSJohn Wren Kennedy
105d583b39bSJohn Wren Kennedylog_note "verify written@ for the same dataset"
106d583b39bSJohn Wren Kennedyblocks=50
107d583b39bSJohn Wren Kennedyfor i in 1 2 3; do
108d583b39bSJohn Wren Kennedy	writtenat=$(get_prop written@snap$i $TESTPOOL/$TESTFS1)
109d583b39bSJohn Wren Kennedy	((expected_writtenat = total * mb_block))
110*dadf5efdSBill Sommerfeld	within_percent $writtenat $expected_writtenat 99.0 || \
111d583b39bSJohn Wren Kennedy	    log_fail "Unexpected written@ value"
112d583b39bSJohn Wren Kennedy	((total = total - blocks))
113d583b39bSJohn Wren Kennedy	((blocks = blocks + 50))
114d583b39bSJohn Wren Kennedydone
115d583b39bSJohn Wren Kennedylog_note "delete data"
116d583b39bSJohn Wren Kennedybefore_written=$(get_prop written $TESTPOOL/$TESTFS1)
1171d32ba66SJohn Wren Kennedylog_must rm /$TESTPOOL/$TESTFS1/testfile.3
118d583b39bSJohn Wren Kennedysnap3_size=0
1191d32ba66SJohn Wren Kennedylog_must sync
120d583b39bSJohn Wren Kennedywritten=$(get_prop written $TESTPOOL/$TESTFS1)
121d583b39bSJohn Wren Kennedywrittenat3=$(get_prop written@snap3 $TESTPOOL/$TESTFS1)
122d583b39bSJohn Wren Kennedy[[ $written -eq $writtenat3 ]] || \
123d583b39bSJohn Wren Kennedy    log_fail "Written and written@ dont match $written $writtenat3"
124d583b39bSJohn Wren Kennedywithin_percent $written $before_written 0.1 && \
125d583b39bSJohn Wren Kennedy    log_fail "Unexpected written value after delete $written $before_written"
126d583b39bSJohn Wren Kennedywrittenat=$(get_prop written@snap1 $TESTPOOL/$TESTFS1)
127d583b39bSJohn Wren Kennedy((snap1_size = snap1_size - 150))
128d583b39bSJohn Wren Kennedy((expected_writtenat = snap1_size * mb_block))
129*dadf5efdSBill Sommerfeldwithin_percent $writtenat $expected_writtenat 99.0 || \
130d583b39bSJohn Wren Kennedy    log_fail "Unexpected written value after delete $writtenat $expected_writtenat"
131d583b39bSJohn Wren Kennedywrittenat=$(get_prop written@snap2 $TESTPOOL/$TESTFS1)
132d583b39bSJohn Wren Kennedy((snap2_size = snap2_size - 150))
133d583b39bSJohn Wren Kennedy((expected_writtenat = snap2_size * mb_block))
134*dadf5efdSBill Sommerfeldwithin_percent $writtenat $expected_writtenat 99.0 || \
135d583b39bSJohn Wren Kennedy    log_fail "Unexpected written value after delete"
136d583b39bSJohn Wren Kennedy
137d583b39bSJohn Wren Kennedylog_note "write data"
138d583b39bSJohn Wren Kennedyblocks=20
1391d32ba66SJohn Wren Kennedylog_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS1/testfile.3 bs=1M \
140d583b39bSJohn Wren Kennedy    count=$blocks
1411d32ba66SJohn Wren Kennedylog_must sync
142d583b39bSJohn Wren Kennedywritten=$(get_prop written $TESTPOOL/$TESTFS1)
143d583b39bSJohn Wren Kennedywrittenat1=$(get_prop written@snap1 $TESTPOOL/$TESTFS1)
144d583b39bSJohn Wren Kennedywrittenat2=$(get_prop written@snap2 $TESTPOOL/$TESTFS1)
145d583b39bSJohn Wren Kennedywrittenat3=$(get_prop written@snap3 $TESTPOOL/$TESTFS1)
146d583b39bSJohn Wren Kennedy((snap3_size = snap3_size + blocks))
147d583b39bSJohn Wren Kennedy((expected_writtenat = snap3_size * mb_block))
148d583b39bSJohn Wren Kennedy[[ $written -eq $writtenat3 ]] || \
149d583b39bSJohn Wren Kennedy    log_fail "Unexpected_written value"
150*dadf5efdSBill Sommerfeldwithin_percent $writtenat3 $expected_writtenat 99.0 || \
151d583b39bSJohn Wren Kennedy    log_fail "Unexpected_written@ value for snap3"
152d583b39bSJohn Wren Kennedy((snap2_size = snap2_size + blocks))
153d583b39bSJohn Wren Kennedy((expected_writtenat = snap2_size * mb_block))
154*dadf5efdSBill Sommerfeldwithin_percent $writtenat2 $expected_writtenat 99.0 || \
155d583b39bSJohn Wren Kennedy    log_fail "Unexpected_written@ value for snap2"
156d583b39bSJohn Wren Kennedy((snap1_size = snap1_size + blocks))
157d583b39bSJohn Wren Kennedy((expected_writtenat = snap1_size * mb_block))
158*dadf5efdSBill Sommerfeldwithin_percent $writtenat1 $expected_writtenat 99.0 || \
159d583b39bSJohn Wren Kennedy    log_fail "Unexpected_written@ value for snap1"
160d583b39bSJohn Wren Kennedy
161d583b39bSJohn Wren Kennedylog_note "write data to a clone"
162d583b39bSJohn Wren Kennedybefore_clone=$(get_prop written $TESTPOOL/$TESTFS1)
1631d32ba66SJohn Wren Kennedylog_must zfs clone $TESTPOOL/$TESTFS1@snap1 $TESTPOOL/$TESTFS1/snap1.clone
1641d32ba66SJohn Wren Kennedylog_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS1/snap1.clone/testfile bs=1M \
165d583b39bSJohn Wren Kennedy    count=40
166d583b39bSJohn Wren Kennedyafter_clone=$(get_prop written $TESTPOOL/$TESTFS1)
167d583b39bSJohn Wren Kennedy[[ $before_clone -eq $after_clone ]] || \
168d583b39bSJohn Wren Kennedy    log_fail "unexpected written for clone $before_clone $after_clone"
169d583b39bSJohn Wren Kennedy
170d583b39bSJohn Wren Kennedylog_note "deleted snapshot"
171d583b39bSJohn Wren Kennedytypeset -l before_written1=$(get_prop_mb written@snap1 $TESTPOOL/$TESTFS1)
172d583b39bSJohn Wren Kennedytypeset -l before_written3=$(get_prop_mb written@snap3 $TESTPOOL/$TESTFS1)
173d583b39bSJohn Wren Kennedytypeset -l snap_before_written2=$(get_prop_mb written $TESTPOOL/$TESTFS1@snap2)
174d583b39bSJohn Wren Kennedytypeset -l snap_before_written3=$(get_prop_mb written $TESTPOOL/$TESTFS1@snap3)
1751d32ba66SJohn Wren Kennedylog_must zfs destroy $TESTPOOL/$TESTFS1@snap2
176d583b39bSJohn Wren Kennedylog_mustnot snapexists $TESTPOOL/$TESTFS1@snap2
1771d32ba66SJohn Wren Kennedylog_must sync
178d583b39bSJohn Wren Kennedywritten1=$(get_prop_mb written@snap1 $TESTPOOL/$TESTFS1)
179d583b39bSJohn Wren Kennedywritten3=$(get_prop_mb written@snap3 $TESTPOOL/$TESTFS1)
180d583b39bSJohn Wren Kennedy[[ $before_written1 -eq $written1 && $before_written3 -eq $written3 ]] || \
181d583b39bSJohn Wren Kennedy    log_fail "unexpected written values $before_written1 $written1"
182d583b39bSJohn Wren Kennedytypeset -l expected_written3
183d583b39bSJohn Wren Kennedy((expected_written3 = snap_before_written2 + snap_before_written3))
184d583b39bSJohn Wren Kennedyprev_written=$(get_prop_mb written $TESTPOOL/$TESTFS1@snap3)
185*dadf5efdSBill Sommerfeldwithin_percent $prev_written $expected_written3 99.0 || \
186d583b39bSJohn Wren Kennedy    log_fail "unexpected written value $prev_written $expected_written3"
187d583b39bSJohn Wren Kennedy
1881d32ba66SJohn Wren Kennedylog_must zfs destroy $TESTPOOL/$TESTFS1@snap3
189d583b39bSJohn Wren Kennedylog_mustnot snapexists $TESTPOOL/$TESTFS1@snap3
190d583b39bSJohn Wren Kennedywritten=$(get_prop written $TESTPOOL/$TESTFS1)
191d583b39bSJohn Wren Kennedywrittenat1=$(get_prop written@snap1 $TESTPOOL/$TESTFS1)
192d583b39bSJohn Wren Kennedy[[ $written -ne $writtenat1 ]] && \
193d583b39bSJohn Wren Kennedy    log_fail "Unexpected last snapshot written value"
194d583b39bSJohn Wren Kennedy
195d583b39bSJohn Wren Kennedylog_note "verify written@ property for recursive datasets"
196d583b39bSJohn Wren Kennedyblocks=10
1971d32ba66SJohn Wren Kennedylog_must zfs snapshot -r $TESTPOOL/$TESTFS1@now
198d583b39bSJohn Wren Kennedyfor ds in $datasets; do
199d583b39bSJohn Wren Kennedy	writtenat=$(get_prop written@now $ds)
200d583b39bSJohn Wren Kennedy	[[ $writtenat -ne 0 ]] && \
201d583b39bSJohn Wren Kennedy	    log_fail "Unexpected written@ value"
2021d32ba66SJohn Wren Kennedy	log_must dd if=/dev/urandom of=/$ds/testfile bs=1M count=$blocks
2031d32ba66SJohn Wren Kennedy	log_must sync
204d583b39bSJohn Wren Kennedy	writtenat=$(get_prop written@now $ds)
205d583b39bSJohn Wren Kennedy	((expected_writtenat = blocks * mb_block))
206d583b39bSJohn Wren Kennedy	within_percent $writtenat $expected_writtenat 0.1 || \
207d583b39bSJohn Wren Kennedy	    log_fail "Unexpected written value"
208d583b39bSJohn Wren Kennedy	((blocks = blocks + 10))
209d583b39bSJohn Wren Kennedydone
210d583b39bSJohn Wren Kennedy
211d583b39bSJohn Wren Kennedylog_note "verify written@ output for recursive datasets"
212d583b39bSJohn Wren Kennedyblocks=20
213d583b39bSJohn Wren Kennedyfor ds in $datasets; do
2141d32ba66SJohn Wren Kennedy	log_must zfs snapshot $ds@current
2151d32ba66SJohn Wren Kennedy	log_must dd if=/dev/urandom of=/$ds/testfile bs=1M \
216d583b39bSJohn Wren Kennedy	    count=$blocks
2171d32ba66SJohn Wren Kennedy	log_must sync
218d583b39bSJohn Wren Kennedydone
219*dadf5efdSBill Sommerfeldrecursive_output=$(zfs get -p -r written@current $TESTPOOL | \
2201d32ba66SJohn Wren Kennedy    grep -v $TESTFS1@ | grep -v $TESTFS2@ | grep -v $TESTFS3@ | \
2211d32ba66SJohn Wren Kennedy    grep -v "VALUE" | grep -v "-")
222*dadf5efdSBill Sommerfeldexpected=$((20 * mb_block))
223d583b39bSJohn Wren Kennedyfor ds in $datasets; do
2241d32ba66SJohn Wren Kennedy	writtenat=$(echo "$recursive_output" | grep -v $ds/)
2251d32ba66SJohn Wren Kennedy	writtenat=$(echo "$writtenat" | grep $ds | awk '{print $3}')
226*dadf5efdSBill Sommerfeld	within_percent $writtenat $expected 99.0 || \
227d583b39bSJohn Wren Kennedy	    log_fail "recursive written property output mismatch"
228d583b39bSJohn Wren Kennedydone
229d583b39bSJohn Wren Kennedy
230d583b39bSJohn Wren Kennedylog_pass "zfs written and written@ property fields print correct values"
231