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
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.
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
24 # 1) Create recursive datasets
25 # 2) Take snapshots, write data and verify written/ written@ properties for
31 # e) Recursive datasets
33 .
$STF_SUITE/include
/libtest.shlib
34 .
$STF_SUITE/include
/math.shlib
38 for ds
in $datasets; do
39 datasetexists
$ds && log_must zfs destroy
-R $TESTPOOL/$TESTFS1
46 typeset
-l value
=$
(get_prop
$prop $dataset)
47 ((value
= value
/ mb_block
))
51 datasets
="$TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS2 \
52 $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3"
54 log_assert
"verify zfs written and written@ property"
59 typeset
-l expected_written
=0
60 typeset
-l expected_writtenat
=0
63 typeset
-l snap1_size
=0
64 typeset
-l snap2_size
=0
65 typeset
-l snap3_size
=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
72 log_must zfs snapshot
$TESTPOOL/$TESTFS1@snap
$i
73 log_must
dd if=/dev
/urandom of
=/$TESTPOOL/$TESTFS1/testfile.
$i bs
=1M \
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))
84 log_note
"verify written property statistics for snapshots"
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.
92 get_prop referenced
$TESTPOOL/$TESTFS1@snap
$i)
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))
102 ((snap2_size
= total-50
))
103 ((snap3_size
= total-100
))
105 log_note
"verify written@ for the same dataset"
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))
115 log_note
"delete data"
116 before_written
=$
(get_prop written
$TESTPOOL/$TESTFS1)
117 log_must
rm /$TESTPOOL/$TESTFS1/testfile
.3
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"
139 log_must
dd if=/dev
/urandom of
=/$TESTPOOL/$TESTFS1/testfile
.3 bs
=1M \
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 \
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
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"
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
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))
211 log_note
"verify written@ output for recursive datasets"
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 \
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 "-")
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"
230 log_pass
"zfs written and written@ property fields print correct values"