| #!/bin/ksh -p |
| # |
| # 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) 2018 by Delphix. All rights reserved. |
| # |
| |
| # DESCRIPTION |
| # Verify zfs destroy test for clones with the livelist feature |
| # enabled. |
| |
| # STRATEGY |
| # 1. Clone where livelist is condensed |
| # - create clone, write several files, delete those files |
| # - check that the number of livelist entries decreases |
| # after the delete |
| # 2. Clone where livelist is deactivated |
| # - create clone, write files. Delete those files and the |
| # file in the filesystem when the snapshot was created |
| # so the clone and snapshot no longer share data |
| # - check that the livelist is destroyed |
| |
| . $STF_SUITE/include/libtest.shlib |
| . $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib |
| |
| function cleanup |
| { |
| log_must zfs destroy -Rf $TESTPOOL/$TESTFS1 |
| # reset the livelist sublist size to the original value |
| set_tunable64 LIVELIST_MAX_ENTRIES $ORIGINAL_MAX |
| # reset the minimum percent shared to 75 |
| set_tunable32 LIVELIST_MIN_PERCENT_SHARED $ORIGINAL_MIN |
| } |
| |
| function check_ll_len |
| { |
| string="$(zdb -vvvvv $TESTPOOL | grep "Livelist")" |
| substring="$1" |
| msg=$2 |
| if test "${string#*$substring}" != "$string"; then |
| return 0 # $substring is in $string |
| else |
| log_note $string |
| log_fail "$msg" # $substring is not in $string |
| fi |
| } |
| |
| function test_condense |
| { |
| # set the max livelist entries to a small value to more easily |
| # trigger a condense |
| set_tunable64 LIVELIST_MAX_ENTRIES 20 |
| # set a small percent shared threshold so the livelist is not disabled |
| set_tunable32 LIVELIST_MIN_PERCENT_SHARED 10 |
| clone_dataset $TESTFS1 snap $TESTCLONE |
| |
| # sync between each write to make sure a new entry is created |
| for i in {0..4}; do |
| log_must mkfile 5m /$TESTPOOL/$TESTCLONE/testfile$i |
| log_must zpool sync $TESTPOOL |
| done |
| |
| check_ll_len "5 entries" "Unexpected livelist size" |
| |
| # sync between each write to allow for a condense of the previous entry |
| for i in {0..4}; do |
| log_must mkfile 5m /$TESTPOOL/$TESTCLONE/testfile$i |
| log_must zpool sync $TESTPOOL |
| done |
| |
| check_ll_len "6 entries" "Condense did not occur" |
| |
| log_must zfs destroy $TESTPOOL/$TESTCLONE |
| check_livelist_gone |
| } |
| |
| function test_deactivated |
| { |
| # Threshold set to 50 percent |
| set_tunable32 LIVELIST_MIN_PERCENT_SHARED 50 |
| clone_dataset $TESTFS1 snap $TESTCLONE |
| |
| log_must mkfile 5m /$TESTPOOL/$TESTCLONE/$TESTFILE0 |
| log_must mkfile 5m /$TESTPOOL/$TESTCLONE/$TESTFILE1 |
| log_must zpool sync $TESTPOOL |
| # snapshot and clone share 'atestfile', 33 percent |
| check_livelist_gone |
| log_must zfs destroy -R $TESTPOOL/$TESTCLONE |
| |
| # Threshold set to 20 percent |
| set_tunable32 LIVELIST_MIN_PERCENT_SHARED 20 |
| clone_dataset $TESTFS1 snap $TESTCLONE |
| |
| log_must mkfile 5m /$TESTPOOL/$TESTCLONE/$TESTFILE0 |
| log_must mkfile 5m /$TESTPOOL/$TESTCLONE/$TESTFILE1 |
| log_must mkfile 5m /$TESTPOOL/$TESTCLONE/$TESTFILE2 |
| log_must zpool sync $TESTPOOL |
| # snapshot and clone share 'atestfile', 25 percent |
| check_livelist_exists $TESTCLONE |
| log_must rm /$TESTPOOL/$TESTCLONE/atestfile |
| # snapshot and clone share no files |
| check_livelist_gone |
| log_must zfs destroy -R $TESTPOOL/$TESTCLONE |
| } |
| |
| ORIGINAL_MAX=$(get_tunable LIVELIST_MAX_ENTRIES) |
| ORIGINAL_MIN=$(get_tunable LIVELIST_MIN_PERCENT_SHARED) |
| |
| log_onexit cleanup |
| log_must zfs create $TESTPOOL/$TESTFS1 |
| log_must mkfile 5m /$TESTPOOL/$TESTFS1/atestfile |
| log_must zfs snapshot $TESTPOOL/$TESTFS1@snap |
| test_condense |
| test_deactivated |
| |
| log_pass "Clone's livelist condenses and disables as expected." |