1#!/bin/ksh -p
2# SPDX-License-Identifier: CDDL-1.0
3#
4# This file and its contents are supplied under the terms of the
5# Common Development and Distribution License ("CDDL"), version 1.0.
6# You may only use this file in accordance with the terms of version
7# 1.0 of the CDDL.
8#
9# A full copy of the text of the CDDL should have accompanied this
10# source.  A copy of the CDDL is also available via the Internet at
11# http://www.illumos.org/license/CDDL.
12#
13
14#
15# Copyright (c) 2016, 2017 by Delphix. All rights reserved.
16#
17
18. $STF_SUITE/tests/functional/channel_program/channel_common.kshlib
19
20#
21# DESCRIPTION:
22#       Multiple interacting promotions in a single txg should succeed.
23#
24
25verify_runnable "global"
26
27fs=$TESTPOOL/$TESTFS/testchild
28clone1=$TESTPOOL/$TESTFS/testchild_clone1
29clone2=$TESTPOOL/$TESTFS/testchild_clone2
30snap1=$fs@testchild_snap1
31snap2=$clone1@testchild_snap2
32
33function cleanup
34{
35    for to_destroy in $fs $clone1 $clone2; do
36        destroy_dataset $to_destroy "-R"
37    done
38}
39
40log_onexit cleanup
41
42#
43# Create a chain of clones and snapshots:
44#
45# snap1 -----------> fs
46#     \--> snap2 --> clone1
47#              \---> clone2
48#
49# Then promote clone2 twice, resulting in:
50#
51# snap1 --> snap2 --> clone2
52#     \         \---> clone1
53#      \------------> fs
54#
55# We then attempt to destroy clone1, which should succeed since it no
56# longer has any dependents.
57#
58log_must zfs create $fs
59log_must zfs snapshot $snap1
60log_must zfs clone $snap1 $clone1
61log_must zfs snapshot $snap2
62log_must zfs clone $snap2 $clone2
63
64log_must zfs unmount -f $clone1
65
66log_must_program_sync $TESTPOOL - <<-EOF
67    assert(zfs.sync.promote("$clone2") == 0)
68    assert(zfs.sync.promote("$clone2") == 0)
69    assert(zfs.sync.destroy("$clone1") == 0)
70EOF
71
72log_pass "Multiple promotes and destroying a demoted fs in one txg works."
73