7290 ZFS test suite needs to control what utilities it can run
[unleashed.git] / usr / src / test / zfs-tests / tests / functional / cli_root / zfs_property / zfs_written_property_001_pos.ksh
blob9e562a2824492967523f6e3ee26882699ef15e65
1 # !/bin/ksh
3 # This file and its contents are supplied under the terms of the
4 # Common Development and Distribution License ("CDDL"), version 1.0.
5 # You may only use this file in accordance with the terms of version
6 # 1.0 of the CDDL.
8 # A full copy of the text of the CDDL should have accompanied this
9 # source. A copy of the CDDL is also available via the Internet at
10 # http://www.illumos.org/license/CDDL.
14 # Copyright (c) 2012, 2016 by Delphix. All rights reserved.
18 # DESCRIPTION
19 # Verify that "zfs list" gives correct values for written and written@
20 # proerties for the dataset when different operations are on done on it
23 # STRATEGY
24 # 1) Create recursive datasets
25 # 2) Take snapshots, write data and verify written/ written@ properties for
26 # following cases
27 # a) Delete data
28 # b) Write Data
29 # c) Clone
30 # d) Delete snapshot
31 # e) Recursive datasets
33 . $STF_SUITE/include/libtest.shlib
34 . $STF_SUITE/include/math.shlib
36 function cleanup
38 for ds in $datasets; do
39 datasetexists $ds && log_must zfs destroy -R $TESTPOOL/$TESTFS1
40 done
42 function get_prop_mb
44 typeset prop=$1
45 typeset dataset=$2
46 typeset -l value=$(get_prop $prop $dataset)
47 ((value = value / mb_block))
48 echo $value
51 datasets="$TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS2 \
52 $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3"
54 log_assert "verify zfs written and written@ property"
55 log_onexit cleanup
57 typeset -l i=1
58 typeset -l blocks=50
59 typeset -l expected_written=0
60 typeset -l expected_writtenat=0
61 typeset -l written=0
62 typeset -l total=0
63 typeset -l snap1_size=0
64 typeset -l snap2_size=0
65 typeset -l snap3_size=0
66 typeset -l mb_block=0
67 ((mb_block = 1024 * 1024))
69 log_note "verify written property statistics for dataset"
70 log_must zfs create -p $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3
71 for i in 1 2 3; do
72 log_must zfs snapshot $TESTPOOL/$TESTFS1@snap$i
73 log_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS1/testfile.$i bs=1M \
74 count=$blocks
75 log_must sync
76 written=$(get_prop written $TESTPOOL/$TESTFS1)
77 ((expected_written=blocks * mb_block))
78 within_percent $written $expected_written 99.5 || \
79 log_fail "Unexpected written value $written $expected_written"
80 ((total = total + blocks))
81 ((blocks = blocks + 50))
82 done
84 log_note "verify written property statistics for snapshots"
85 blocks=0
86 for i in 1 2 3; do
87 written=$(get_prop written $TESTPOOL/$TESTFS1@snap$i)
88 if [[ $blocks -eq 0 ]]; then
89 # Written value for the frist non-clone snapshot is
90 # expected to be equal to the referenced value.
91 expected_written=$( \
92 get_prop referenced $TESTPOOL/$TESTFS1@snap$i)
93 else
94 ((expected_written = blocks * mb_block))
96 within_percent $written $expected_written 99.5 || \
97 log_fail "Unexpected written value $written $expected_written $i"
98 ((blocks = blocks + 50))
99 done
101 snap1_size=$total
102 ((snap2_size = total-50))
103 ((snap3_size = total-100))
105 log_note "verify written@ for the same dataset"
106 blocks=50
107 for i in 1 2 3; do
108 writtenat=$(get_prop written@snap$i $TESTPOOL/$TESTFS1)
109 ((expected_writtenat = total * mb_block))
110 within_percent $writtenat $expected_writtenat 99.5 || \
111 log_fail "Unexpected written@ value"
112 ((total = total - blocks))
113 ((blocks = blocks + 50))
114 done
115 log_note "delete data"
116 before_written=$(get_prop written $TESTPOOL/$TESTFS1)
117 log_must rm /$TESTPOOL/$TESTFS1/testfile.3
118 snap3_size=0
119 log_must sync
120 written=$(get_prop written $TESTPOOL/$TESTFS1)
121 writtenat3=$(get_prop written@snap3 $TESTPOOL/$TESTFS1)
122 [[ $written -eq $writtenat3 ]] || \
123 log_fail "Written and written@ dont match $written $writtenat3"
124 within_percent $written $before_written 0.1 && \
125 log_fail "Unexpected written value after delete $written $before_written"
126 writtenat=$(get_prop written@snap1 $TESTPOOL/$TESTFS1)
127 ((snap1_size = snap1_size - 150))
128 ((expected_writtenat = snap1_size * mb_block))
129 within_percent $writtenat $expected_writtenat 99.5 || \
130 log_fail "Unexpected written value after delete $writtenat $expected_writtenat"
131 writtenat=$(get_prop written@snap2 $TESTPOOL/$TESTFS1)
132 ((snap2_size = snap2_size - 150))
133 ((expected_writtenat = snap2_size * mb_block))
134 within_percent $writtenat $expected_writtenat 99.5 || \
135 log_fail "Unexpected written value after delete"
137 log_note "write data"
138 blocks=20
139 log_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS1/testfile.3 bs=1M \
140 count=$blocks
141 log_must sync
142 written=$(get_prop written $TESTPOOL/$TESTFS1)
143 writtenat1=$(get_prop written@snap1 $TESTPOOL/$TESTFS1)
144 writtenat2=$(get_prop written@snap2 $TESTPOOL/$TESTFS1)
145 writtenat3=$(get_prop written@snap3 $TESTPOOL/$TESTFS1)
146 ((snap3_size = snap3_size + blocks))
147 ((expected_writtenat = snap3_size * mb_block))
148 [[ $written -eq $writtenat3 ]] || \
149 log_fail "Unexpected_written value"
150 within_percent $writtenat3 $expected_writtenat 99.5 || \
151 log_fail "Unexpected_written@ value for snap3"
152 ((snap2_size = snap2_size + blocks))
153 ((expected_writtenat = snap2_size * mb_block))
154 within_percent $writtenat2 $expected_writtenat 99.5 || \
155 log_fail "Unexpected_written@ value for snap2"
156 ((snap1_size = snap1_size + blocks))
157 ((expected_writtenat = snap1_size * mb_block))
158 within_percent $writtenat1 $expected_writtenat 99.5 || \
159 log_fail "Unexpected_written@ value for snap1"
161 log_note "write data to a clone"
162 before_clone=$(get_prop written $TESTPOOL/$TESTFS1)
163 log_must zfs clone $TESTPOOL/$TESTFS1@snap1 $TESTPOOL/$TESTFS1/snap1.clone
164 log_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS1/snap1.clone/testfile bs=1M \
165 count=40
166 after_clone=$(get_prop written $TESTPOOL/$TESTFS1)
167 [[ $before_clone -eq $after_clone ]] || \
168 log_fail "unexpected written for clone $before_clone $after_clone"
170 log_note "deleted snapshot"
171 typeset -l before_written1=$(get_prop_mb written@snap1 $TESTPOOL/$TESTFS1)
172 typeset -l before_written3=$(get_prop_mb written@snap3 $TESTPOOL/$TESTFS1)
173 typeset -l snap_before_written2=$(get_prop_mb written $TESTPOOL/$TESTFS1@snap2)
174 typeset -l snap_before_written3=$(get_prop_mb written $TESTPOOL/$TESTFS1@snap3)
175 log_must zfs destroy $TESTPOOL/$TESTFS1@snap2
176 log_mustnot snapexists $TESTPOOL/$TESTFS1@snap2
177 log_must sync
178 written1=$(get_prop_mb written@snap1 $TESTPOOL/$TESTFS1)
179 written3=$(get_prop_mb written@snap3 $TESTPOOL/$TESTFS1)
180 [[ $before_written1 -eq $written1 && $before_written3 -eq $written3 ]] || \
181 log_fail "unexpected written values $before_written1 $written1"
182 typeset -l expected_written3
183 ((expected_written3 = snap_before_written2 + snap_before_written3))
184 prev_written=$(get_prop_mb written $TESTPOOL/$TESTFS1@snap3)
185 within_percent $prev_written $expected_written3 99.5 || \
186 log_fail "unexpected written value $prev_written $expected_written3"
188 log_must zfs destroy $TESTPOOL/$TESTFS1@snap3
189 log_mustnot snapexists $TESTPOOL/$TESTFS1@snap3
190 written=$(get_prop written $TESTPOOL/$TESTFS1)
191 writtenat1=$(get_prop written@snap1 $TESTPOOL/$TESTFS1)
192 [[ $written -ne $writtenat1 ]] && \
193 log_fail "Unexpected last snapshot written value"
195 log_note "verify written@ property for recursive datasets"
196 blocks=10
197 log_must zfs snapshot -r $TESTPOOL/$TESTFS1@now
198 for ds in $datasets; do
199 writtenat=$(get_prop written@now $ds)
200 [[ $writtenat -ne 0 ]] && \
201 log_fail "Unexpected written@ value"
202 log_must dd if=/dev/urandom of=/$ds/testfile bs=1M count=$blocks
203 log_must sync
204 writtenat=$(get_prop written@now $ds)
205 ((expected_writtenat = blocks * mb_block))
206 within_percent $writtenat $expected_writtenat 0.1 || \
207 log_fail "Unexpected written value"
208 ((blocks = blocks + 10))
209 done
211 log_note "verify written@ output for recursive datasets"
212 blocks=20
213 for ds in $datasets; do
214 log_must zfs snapshot $ds@current
215 log_must dd if=/dev/urandom of=/$ds/testfile bs=1M \
216 count=$blocks
217 log_must sync
218 done
219 recursive_output=$(zfs get -r written@current $TESTPOOL | \
220 grep -v $TESTFS1@ | grep -v $TESTFS2@ | grep -v $TESTFS3@ | \
221 grep -v "VALUE" | grep -v "-")
222 expected="20.0M"
223 for ds in $datasets; do
224 writtenat=$(echo "$recursive_output" | grep -v $ds/)
225 writtenat=$(echo "$writtenat" | grep $ds | awk '{print $3}')
226 [[ $writtenat == $expected ]] || \
227 log_fail "recursive written property output mismatch"
228 done
230 log_pass "zfs written and written@ property fields print correct values"