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) 2018, 2020 by Delphix. All rights reserved.
18 # Verify zfs destroy test for clones with the livelist feature
22 # 1. One clone with an empty livelist
23 # - create the clone, check that livelist exists
24 # - delete the clone, check that livelist is eventually
26 # 2. One clone with populated livelist
27 # - create the clone, check that livelist exists
28 # - write multiple files to the clone
29 # - delete the clone, check that livelist is eventually
31 # 3. Multiple clones with empty livelists
32 # - same as 1. but with multiple clones
33 # 4. Multiple clones with populated livelists
34 # - same as 2. but with multiple clones
35 # 5. Clone of clone with populated livelists with promote
37 . $STF_SUITE/include/libtest.shlib
38 . $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib
42 datasetexists $TESTPOOL/$TESTFS1 && zfs destroy -R $TESTPOOL/$TESTFS1
43 # reset the livelist sublist size to its original value
44 set_tunable64 LIVELIST_MAX_ENTRIES $ORIGINAL_MAX
47 function clone_write_file
49 log_must mkfile 1m /$TESTPOOL/$1/$2
50 log_must zpool sync $TESTPOOL
53 function test_one_empty
55 clone_dataset $TESTFS1 snap $TESTCLONE
57 log_must zfs destroy $TESTPOOL/$TESTCLONE
63 clone_dataset $TESTFS1 snap $TESTCLONE
65 clone_write_file $TESTCLONE $TESTFILE0
66 clone_write_file $TESTCLONE $TESTFILE1
67 clone_write_file $TESTCLONE $TESTFILE2
68 log_must rm /$TESTPOOL/$TESTCLONE/$TESTFILE0
69 log_must rm /$TESTPOOL/$TESTCLONE/$TESTFILE2
70 check_livelist_exists $TESTCLONE
72 log_must zfs destroy $TESTPOOL/$TESTCLONE
76 function test_multiple_empty
78 clone_dataset $TESTFS1 snap $TESTCLONE
79 clone_dataset $TESTFS1 snap $TESTCLONE1
80 clone_dataset $TESTFS1 snap $TESTCLONE2
82 log_must zfs destroy $TESTPOOL/$TESTCLONE
83 log_must zfs destroy $TESTPOOL/$TESTCLONE1
84 log_must zfs destroy $TESTPOOL/$TESTCLONE2
88 function test_multiple
90 clone_dataset $TESTFS1 snap $TESTCLONE
91 clone_dataset $TESTFS1 snap $TESTCLONE1
92 clone_dataset $TESTFS1 snap $TESTCLONE2
94 clone_write_file $TESTCLONE $TESTFILE0
96 clone_write_file $TESTCLONE1 $TESTFILE0
97 clone_write_file $TESTCLONE1 $TESTFILE1
98 clone_write_file $TESTCLONE1 $TESTFILE2
100 clone_write_file $TESTCLONE2 $TESTFILE0
101 log_must rm /$TESTPOOL/$TESTCLONE2/$TESTFILE0
102 clone_write_file $TESTCLONE2 $TESTFILE1
103 log_must rm /$TESTPOOL/$TESTCLONE2/$TESTFILE1
105 check_livelist_exists $TESTCLONE
106 check_livelist_exists $TESTCLONE1
107 check_livelist_exists $TESTCLONE2
109 log_must zfs destroy $TESTPOOL/$TESTCLONE
110 log_must zfs destroy $TESTPOOL/$TESTCLONE1
111 log_must zfs destroy $TESTPOOL/$TESTCLONE2
115 function test_promote
117 clone_dataset $TESTFS1 snap $TESTCLONE
119 log_must zfs promote $TESTPOOL/$TESTCLONE
121 log_must zfs destroy -R $TESTPOOL/$TESTCLONE
124 function test_clone_clone_promote
126 log_must zfs create $TESTPOOL/fs
127 log_must dd if=/dev/zero of=/$TESTPOOL/fs/file bs=128k count=100
128 log_must zfs snapshot $TESTPOOL/fs@snap
129 log_must zfs clone $TESTPOOL/fs@snap $TESTPOOL/clone
130 log_must dd if=/dev/zero of=/$TESTPOOL/clone/clonefile bs=128k count=10
131 log_must zfs snapshot $TESTPOOL/clone@csnap
132 log_must zfs clone $TESTPOOL/clone@csnap $TESTPOOL/cloneclone
134 check_livelist_exists clone
135 check_livelist_exists cloneclone
137 # Promote should remove both clones' livelists
138 log_must zfs promote $TESTPOOL/cloneclone
141 # This destroy should not use a livelist
142 log_must zfs destroy $TESTPOOL/clone
143 log_must zdb -bcc $TESTPOOL
146 ORIGINAL_MAX=$(get_tunable LIVELIST_MAX_ENTRIES)
149 log_must zfs create $TESTPOOL/$TESTFS1
150 log_must mkfile 20m /$TESTPOOL/$TESTFS1/atestfile
151 log_must zfs snapshot $TESTPOOL/$TESTFS1@snap
153 # set a small livelist entry size to more easily test multiple entry livelists
154 set_tunable64 LIVELIST_MAX_ENTRIES 20
161 test_clone_clone_promote
163 log_pass "Clone with the livelist feature enabled could be destroyed," \
164 "also could be promoted and destroyed as expected."