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