PageRenderTime 30ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/zfs-tests/tests/functional/cli_root/zfs_property/zfs_written_property_001_pos.ksh

http://github.com/zfsonlinux/zfs
Korn Shell | 230 lines | 188 code | 11 blank | 31 comment | 13 complexity | 7da1c22f3c345586844538090567f5e6 MD5 | raw file
Possible License(s): Apache-2.0, MPL-2.0-no-copyleft-exception
  1. #!/bin/ksh
  2. #
  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.
  7. #
  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.
  11. #
  12. #
  13. # Copyright (c) 2012, 2017 by Delphix. All rights reserved.
  14. #
  15. #
  16. # DESCRIPTION
  17. # Verify that "zfs list" gives correct values for written and written@
  18. # properties for the dataset when different operations are on done on it
  19. #
  20. #
  21. # STRATEGY
  22. # 1) Create recursive datasets
  23. # 2) Take snapshots, write data and verify written/ written@ properties for
  24. # following cases
  25. # a) Delete data
  26. # b) Write Data
  27. # c) Clone
  28. # d) Delete snapshot
  29. # e) Recursive datasets
  30. . $STF_SUITE/include/libtest.shlib
  31. . $STF_SUITE/include/math.shlib
  32. function cleanup
  33. {
  34. for ds in $datasets; do
  35. datasetexists $ds && log_must zfs destroy -R $TESTPOOL/$TESTFS1
  36. done
  37. }
  38. function get_prop_mb
  39. {
  40. typeset prop=$1
  41. typeset dataset=$2
  42. typeset -l value=$(get_prop $prop $dataset)
  43. ((value = value / mb_block))
  44. echo $value
  45. }
  46. datasets="$TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS2 \
  47. $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3"
  48. log_assert "verify zfs written and written@ property"
  49. log_onexit cleanup
  50. typeset -l i=1
  51. typeset -l blocks=50
  52. typeset -l expected_written=0
  53. typeset -l expected_writtenat=0
  54. typeset -l written=0
  55. typeset -l total=0
  56. typeset -l snap1_size=0
  57. typeset -l snap2_size=0
  58. typeset -l snap3_size=0
  59. typeset -l mb_block=0
  60. ((mb_block = 1024 * 1024))
  61. log_note "verify written property statistics for dataset"
  62. log_must zfs create -p $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3
  63. for i in 1 2 3; do
  64. log_must zfs snapshot $TESTPOOL/$TESTFS1@snap$i
  65. log_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS1/testfile.$i bs=1M \
  66. count=$blocks
  67. sync_pool
  68. written=$(get_prop written $TESTPOOL/$TESTFS1)
  69. ((expected_written=blocks * mb_block))
  70. within_percent $written $expected_written 99.5 || \
  71. log_fail "Unexpected written value $written $expected_written"
  72. ((total = total + blocks))
  73. ((blocks = blocks + 50))
  74. done
  75. log_note "verify written property statistics for snapshots"
  76. blocks=0
  77. for i in 1 2 3; do
  78. written=$(get_prop written $TESTPOOL/$TESTFS1@snap$i)
  79. if [[ $blocks -eq 0 ]]; then
  80. # Written value for the first non-clone snapshot is
  81. # expected to be equal to the referenced value.
  82. expected_written=$( \
  83. get_prop referenced $TESTPOOL/$TESTFS1@snap$i)
  84. else
  85. ((expected_written = blocks * mb_block))
  86. fi
  87. within_percent $written $expected_written 99.5 || \
  88. log_fail "Unexpected written value $written $expected_written $i"
  89. ((blocks = blocks + 50))
  90. done
  91. snap1_size=$total
  92. ((snap2_size = total-50))
  93. ((snap3_size = total-100))
  94. log_note "verify written@ for the same dataset"
  95. blocks=50
  96. for i in 1 2 3; do
  97. writtenat=$(get_prop written@snap$i $TESTPOOL/$TESTFS1)
  98. ((expected_writtenat = total * mb_block))
  99. within_percent $writtenat $expected_writtenat 99.5 || \
  100. log_fail "Unexpected written@ value"
  101. ((total = total - blocks))
  102. ((blocks = blocks + 50))
  103. done
  104. log_note "delete data"
  105. before_written=$(get_prop written $TESTPOOL/$TESTFS1)
  106. log_must rm /$TESTPOOL/$TESTFS1/testfile.3
  107. snap3_size=0
  108. sync_pool
  109. written=$(get_prop written $TESTPOOL/$TESTFS1)
  110. writtenat3=$(get_prop written@snap3 $TESTPOOL/$TESTFS1)
  111. [[ $written -eq $writtenat3 ]] || \
  112. log_fail "Written and written@ don't match $written $writtenat3"
  113. within_percent $written $before_written 0.1 && \
  114. log_fail "Unexpected written value after delete $written $before_written"
  115. writtenat=$(get_prop written@snap1 $TESTPOOL/$TESTFS1)
  116. ((snap1_size = snap1_size - 150))
  117. ((expected_writtenat = snap1_size * mb_block))
  118. within_percent $writtenat $expected_writtenat 99.5 || \
  119. log_fail "Unexpected written value after delete $writtenat $expected_writtenat"
  120. writtenat=$(get_prop written@snap2 $TESTPOOL/$TESTFS1)
  121. ((snap2_size = snap2_size - 150))
  122. ((expected_writtenat = snap2_size * mb_block))
  123. within_percent $writtenat $expected_writtenat 99.5 || \
  124. log_fail "Unexpected written value after delete"
  125. log_note "write data"
  126. blocks=20
  127. log_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS1/testfile.3 bs=1M \
  128. count=$blocks
  129. sync_pool
  130. written=$(get_prop written $TESTPOOL/$TESTFS1)
  131. writtenat1=$(get_prop written@snap1 $TESTPOOL/$TESTFS1)
  132. writtenat2=$(get_prop written@snap2 $TESTPOOL/$TESTFS1)
  133. writtenat3=$(get_prop written@snap3 $TESTPOOL/$TESTFS1)
  134. ((snap3_size = snap3_size + blocks))
  135. ((expected_writtenat = snap3_size * mb_block))
  136. [[ $written -eq $writtenat3 ]] || \
  137. log_fail "Unexpected_written value"
  138. within_percent $writtenat3 $expected_writtenat 99.5 || \
  139. log_fail "Unexpected_written@ value for snap3"
  140. ((snap2_size = snap2_size + blocks))
  141. ((expected_writtenat = snap2_size * mb_block))
  142. within_percent $writtenat2 $expected_writtenat 99.5 || \
  143. log_fail "Unexpected_written@ value for snap2"
  144. ((snap1_size = snap1_size + blocks))
  145. ((expected_writtenat = snap1_size * mb_block))
  146. within_percent $writtenat1 $expected_writtenat 99.5 || \
  147. log_fail "Unexpected_written@ value for snap1"
  148. log_note "write data to a clone"
  149. before_clone=$(get_prop written $TESTPOOL/$TESTFS1)
  150. log_must zfs clone $TESTPOOL/$TESTFS1@snap1 $TESTPOOL/$TESTFS1/snap1.clone
  151. log_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS1/snap1.clone/testfile bs=1M \
  152. count=40
  153. after_clone=$(get_prop written $TESTPOOL/$TESTFS1)
  154. within_percent $before_clone $after_clone 99.5 || \
  155. log_fail "unexpected written for clone $before_clone $after_clone"
  156. log_note "deleted snapshot"
  157. typeset -l before_written1=$(get_prop_mb written@snap1 $TESTPOOL/$TESTFS1)
  158. typeset -l before_written3=$(get_prop_mb written@snap3 $TESTPOOL/$TESTFS1)
  159. typeset -l snap_before_written2=$(get_prop_mb written $TESTPOOL/$TESTFS1@snap2)
  160. typeset -l snap_before_written3=$(get_prop_mb written $TESTPOOL/$TESTFS1@snap3)
  161. log_must zfs destroy $TESTPOOL/$TESTFS1@snap2
  162. log_mustnot snapexists $TESTPOOL/$TESTFS1@snap2
  163. sync_pool
  164. written1=$(get_prop_mb written@snap1 $TESTPOOL/$TESTFS1)
  165. written3=$(get_prop_mb written@snap3 $TESTPOOL/$TESTFS1)
  166. [[ $before_written1 -eq $written1 && $before_written3 -eq $written3 ]] || \
  167. log_fail "unexpected written values $before_written1 $written1"
  168. typeset -l expected_written3
  169. ((expected_written3 = snap_before_written2 + snap_before_written3))
  170. prev_written=$(get_prop_mb written $TESTPOOL/$TESTFS1@snap3)
  171. within_percent $prev_written $expected_written3 99.5 || \
  172. log_fail "unexpected written value $prev_written $expected_written3"
  173. log_must zfs destroy $TESTPOOL/$TESTFS1@snap3
  174. log_mustnot snapexists $TESTPOOL/$TESTFS1@snap3
  175. written=$(get_prop written $TESTPOOL/$TESTFS1)
  176. writtenat1=$(get_prop written@snap1 $TESTPOOL/$TESTFS1)
  177. [[ $written -ne $writtenat1 ]] && \
  178. log_fail "Unexpected last snapshot written value"
  179. log_note "verify written@ property for recursive datasets"
  180. blocks=10
  181. log_must zfs snapshot -r $TESTPOOL/$TESTFS1@now
  182. for ds in $datasets; do
  183. writtenat=$(get_prop written@now $ds)
  184. [[ $writtenat -ne 0 ]] && \
  185. log_fail "Unexpected written@ value"
  186. log_must dd if=/dev/urandom of=/$ds/testfile bs=1M count=$blocks
  187. sync_pool
  188. writtenat=$(get_prop written@now $ds)
  189. ((expected_writtenat = blocks * mb_block))
  190. within_percent $writtenat $expected_writtenat 0.1 || \
  191. log_fail "Unexpected written value"
  192. ((blocks = blocks + 10))
  193. done
  194. log_note "verify written@ output for recursive datasets"
  195. blocks=20
  196. for ds in $datasets; do
  197. log_must zfs snapshot $ds@current
  198. log_must dd if=/dev/urandom of=/$ds/testfile bs=1M \
  199. count=$blocks
  200. sync_pool
  201. done
  202. recursive_output=$(zfs get -p -r written@current $TESTPOOL | \
  203. grep -v $TESTFS1@ | grep -v $TESTFS2@ | grep -v $TESTFS3@ | \
  204. grep -v "VALUE" | grep -v "-")
  205. expected="$((20 * mb_block))"
  206. for ds in $datasets; do
  207. writtenat=$(echo "$recursive_output" | grep -v $ds/)
  208. writtenat=$(echo "$writtenat" | grep $ds | awk '{print $3}')
  209. within_percent $writtenat $expected 99.5 || \
  210. log_fail "Unexpected written@ value on $ds"
  211. done
  212. log_pass "zfs written and written@ property fields print correct values"