aboutsummaryrefslogtreecommitdiff
path: root/sys/contrib/openzfs/tests/zfs-tests/tests/functional/cli_root/zfs_property/zfs_written_property_001_pos.ksh
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/openzfs/tests/zfs-tests/tests/functional/cli_root/zfs_property/zfs_written_property_001_pos.ksh')
-rwxr-xr-xsys/contrib/openzfs/tests/zfs-tests/tests/functional/cli_root/zfs_property/zfs_written_property_001_pos.ksh230
1 files changed, 230 insertions, 0 deletions
diff --git a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/cli_root/zfs_property/zfs_written_property_001_pos.ksh b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/cli_root/zfs_property/zfs_written_property_001_pos.ksh
new file mode 100755
index 000000000000..cbbacace1ec6
--- /dev/null
+++ b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/cli_root/zfs_property/zfs_written_property_001_pos.ksh
@@ -0,0 +1,230 @@
+#!/bin/ksh
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2012, 2017 by Delphix. All rights reserved.
+#
+
+#
+# DESCRIPTION
+# Verify that "zfs list" gives correct values for written and written@
+# properties for the dataset when different operations are on done on it
+#
+#
+# STRATEGY
+# 1) Create recursive datasets
+# 2) Take snapshots, write data and verify written/ written@ properties for
+# following cases
+# a) Delete data
+# b) Write Data
+# c) Clone
+# d) Delete snapshot
+# e) Recursive datasets
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/include/math.shlib
+
+function cleanup
+{
+ for ds in $datasets; do
+ datasetexists $ds && log_must zfs destroy -R $TESTPOOL/$TESTFS1
+ done
+}
+function get_prop_mb
+{
+ typeset prop=$1
+ typeset dataset=$2
+ typeset -l value=$(get_prop $prop $dataset)
+ ((value = value / mb_block))
+ echo $value
+}
+
+datasets="$TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS2 \
+ $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3"
+
+log_assert "verify zfs written and written@ property"
+log_onexit cleanup
+
+typeset -l i=1
+typeset -l blocks=50
+typeset -l expected_written=0
+typeset -l expected_writtenat=0
+typeset -l written=0
+typeset -l total=0
+typeset -l snap1_size=0
+typeset -l snap2_size=0
+typeset -l snap3_size=0
+typeset -l mb_block=0
+((mb_block = 1024 * 1024))
+
+log_note "verify written property statistics for dataset"
+log_must zfs create -p $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3
+for i in 1 2 3; do
+ log_must zfs snapshot $TESTPOOL/$TESTFS1@snap$i
+ log_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS1/testfile.$i bs=1M \
+ count=$blocks
+ sync_pool
+ written=$(get_prop written $TESTPOOL/$TESTFS1)
+ ((expected_written=blocks * mb_block))
+ within_percent $written $expected_written 99.5 || \
+ log_fail "Unexpected written value $written $expected_written"
+ ((total = total + blocks))
+ ((blocks = blocks + 50))
+done
+
+log_note "verify written property statistics for snapshots"
+blocks=0
+for i in 1 2 3; do
+ written=$(get_prop written $TESTPOOL/$TESTFS1@snap$i)
+ if [[ $blocks -eq 0 ]]; then
+ # Written value for the first non-clone snapshot is
+ # expected to be equal to the referenced value.
+ expected_written=$( \
+ get_prop referenced $TESTPOOL/$TESTFS1@snap$i)
+ else
+ ((expected_written = blocks * mb_block))
+ fi
+ within_percent $written $expected_written 99.5 || \
+ log_fail "Unexpected written value $written $expected_written $i"
+ ((blocks = blocks + 50))
+done
+
+snap1_size=$total
+((snap2_size = total-50))
+((snap3_size = total-100))
+
+log_note "verify written@ for the same dataset"
+blocks=50
+for i in 1 2 3; do
+ writtenat=$(get_prop written@snap$i $TESTPOOL/$TESTFS1)
+ ((expected_writtenat = total * mb_block))
+ within_percent $writtenat $expected_writtenat 99.5 || \
+ log_fail "Unexpected written@ value"
+ ((total = total - blocks))
+ ((blocks = blocks + 50))
+done
+log_note "delete data"
+before_written=$(get_prop written $TESTPOOL/$TESTFS1)
+log_must rm /$TESTPOOL/$TESTFS1/testfile.3
+snap3_size=0
+sync_pool
+written=$(get_prop written $TESTPOOL/$TESTFS1)
+writtenat3=$(get_prop written@snap3 $TESTPOOL/$TESTFS1)
+[[ $written -eq $writtenat3 ]] || \
+ log_fail "Written and written@ don't match $written $writtenat3"
+within_percent $written $before_written 0.1 && \
+ log_fail "Unexpected written value after delete $written $before_written"
+writtenat=$(get_prop written@snap1 $TESTPOOL/$TESTFS1)
+((snap1_size = snap1_size - 150))
+((expected_writtenat = snap1_size * mb_block))
+within_percent $writtenat $expected_writtenat 99.5 || \
+ log_fail "Unexpected written value after delete $writtenat $expected_writtenat"
+writtenat=$(get_prop written@snap2 $TESTPOOL/$TESTFS1)
+((snap2_size = snap2_size - 150))
+((expected_writtenat = snap2_size * mb_block))
+within_percent $writtenat $expected_writtenat 99.5 || \
+ log_fail "Unexpected written value after delete"
+
+log_note "write data"
+blocks=20
+log_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS1/testfile.3 bs=1M \
+ count=$blocks
+sync_pool
+written=$(get_prop written $TESTPOOL/$TESTFS1)
+writtenat1=$(get_prop written@snap1 $TESTPOOL/$TESTFS1)
+writtenat2=$(get_prop written@snap2 $TESTPOOL/$TESTFS1)
+writtenat3=$(get_prop written@snap3 $TESTPOOL/$TESTFS1)
+((snap3_size = snap3_size + blocks))
+((expected_writtenat = snap3_size * mb_block))
+[[ $written -eq $writtenat3 ]] || \
+ log_fail "Unexpected_written value"
+within_percent $writtenat3 $expected_writtenat 99.5 || \
+ log_fail "Unexpected_written@ value for snap3"
+((snap2_size = snap2_size + blocks))
+((expected_writtenat = snap2_size * mb_block))
+within_percent $writtenat2 $expected_writtenat 99.5 || \
+ log_fail "Unexpected_written@ value for snap2"
+((snap1_size = snap1_size + blocks))
+((expected_writtenat = snap1_size * mb_block))
+within_percent $writtenat1 $expected_writtenat 99.5 || \
+ log_fail "Unexpected_written@ value for snap1"
+
+log_note "write data to a clone"
+before_clone=$(get_prop written $TESTPOOL/$TESTFS1)
+log_must zfs clone $TESTPOOL/$TESTFS1@snap1 $TESTPOOL/$TESTFS1/snap1.clone
+log_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS1/snap1.clone/testfile bs=1M \
+ count=40
+after_clone=$(get_prop written $TESTPOOL/$TESTFS1)
+within_percent $before_clone $after_clone 99.5 || \
+ log_fail "unexpected written for clone $before_clone $after_clone"
+
+log_note "deleted snapshot"
+typeset -l before_written1=$(get_prop_mb written@snap1 $TESTPOOL/$TESTFS1)
+typeset -l before_written3=$(get_prop_mb written@snap3 $TESTPOOL/$TESTFS1)
+typeset -l snap_before_written2=$(get_prop_mb written $TESTPOOL/$TESTFS1@snap2)
+typeset -l snap_before_written3=$(get_prop_mb written $TESTPOOL/$TESTFS1@snap3)
+log_must zfs destroy $TESTPOOL/$TESTFS1@snap2
+log_mustnot snapexists $TESTPOOL/$TESTFS1@snap2
+sync_pool
+written1=$(get_prop_mb written@snap1 $TESTPOOL/$TESTFS1)
+written3=$(get_prop_mb written@snap3 $TESTPOOL/$TESTFS1)
+[[ $before_written1 -eq $written1 && $before_written3 -eq $written3 ]] || \
+ log_fail "unexpected written values $before_written1 $written1"
+typeset -l expected_written3
+((expected_written3 = snap_before_written2 + snap_before_written3))
+prev_written=$(get_prop_mb written $TESTPOOL/$TESTFS1@snap3)
+within_percent $prev_written $expected_written3 99.5 || \
+ log_fail "unexpected written value $prev_written $expected_written3"
+
+log_must zfs destroy $TESTPOOL/$TESTFS1@snap3
+log_mustnot snapexists $TESTPOOL/$TESTFS1@snap3
+written=$(get_prop written $TESTPOOL/$TESTFS1)
+writtenat1=$(get_prop written@snap1 $TESTPOOL/$TESTFS1)
+[[ $written -ne $writtenat1 ]] && \
+ log_fail "Unexpected last snapshot written value"
+
+log_note "verify written@ property for recursive datasets"
+blocks=10
+log_must zfs snapshot -r $TESTPOOL/$TESTFS1@now
+for ds in $datasets; do
+ writtenat=$(get_prop written@now $ds)
+ [[ $writtenat -ne 0 ]] && \
+ log_fail "Unexpected written@ value"
+ log_must dd if=/dev/urandom of=/$ds/testfile bs=1M count=$blocks
+ sync_pool
+ writtenat=$(get_prop written@now $ds)
+ ((expected_writtenat = blocks * mb_block))
+ within_percent $writtenat $expected_writtenat 0.1 || \
+ log_fail "Unexpected written value"
+ ((blocks = blocks + 10))
+done
+
+log_note "verify written@ output for recursive datasets"
+blocks=20
+for ds in $datasets; do
+ log_must zfs snapshot $ds@current
+ log_must dd if=/dev/urandom of=/$ds/testfile bs=1M \
+ count=$blocks
+ sync_pool
+done
+recursive_output=$(zfs get -p -r written@current $TESTPOOL | \
+ grep -v $TESTFS1@ | grep -v $TESTFS2@ | grep -v $TESTFS3@ | \
+ grep -v "VALUE" | grep -v "-")
+expected="$((20 * mb_block))"
+for ds in $datasets; do
+ writtenat=$(echo "$recursive_output" | grep -v $ds/)
+ writtenat=$(echo "$writtenat" | grep $ds | awk '{print $3}')
+ within_percent $writtenat $expected 99.5 || \
+ log_fail "Unexpected written@ value on $ds"
+done
+
+log_pass "zfs written and written@ property fields print correct values"