blob: 447fbb36b412c8bd9e998a2fd6de44a854489a15 [file] [log] [blame]
#!/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) 2017 by Delphix. All rights reserved.
#
. $STF_SUITE/include/libtest.shlib
#
# DESCRIPTION:
# When a snapshot is destroyed, we used to recurse all clones
# that are downstream of the destroyed snapshot (e.g. to remove
# its key and merge its deadlist entries to the previous one).
# This recursion would break the stack on deeply nested clone
# hierarchies. To avoid this problem today, we keep heap-allocated
# records of all the clones as we traverse their hierarchy.
#
# This test ensures and showcases that our new method works with
# deeply nested clone hierarchies.
#
# STRATEGY:
# 1. Create an fs and take a snapshot of it (snapshot foo)
# 2. Take a second snapshot of the same fs (snapshot bar) on
# top of snapshot foo
# 3. Create a clone of snapshot bar and then take a snapshot
# of it.
# 4. Create a clone of the newly-created snapshot and then
# take a snapshot of it.
# 5. Repeat step [4] many times to create a deeply nested hierarchy.
# 6. Destroy snapshot foo.
#
verify_runnable "both"
typeset FS0=$TESTPOOL/0
typeset FOO=foo
typeset BAR=BAR
typeset FS0SNAPFOO=$FS0@$FOO
typeset FS0SNAPBAR=$FS0@$BAR
typeset -i numds=300
log_must zfs create $FS0
function test_cleanup
{
log_must zfs destroy -Rf $FS0
return 0
}
log_must zfs snapshot $FS0SNAPFOO
log_must zfs snapshot $FS0SNAPBAR
log_onexit test_cleanup
for (( i=1; i<numds; i++ )); do
log_must zfs clone $TESTPOOL/$((i-1))@$BAR $TESTPOOL/$i
log_must zfs snapshot $TESTPOOL/$i@$BAR
done
log_must zfs destroy $FS0SNAPFOO
log_pass "Snapshot deletion doesn't break the stack in deeply nested " \
"clone hierarchies."