153 lines
6.5 KiB
Bash
Executable File
153 lines
6.5 KiB
Bash
Executable File
#!/bin/ksh
|
|
|
|
#
|
|
# 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.
|
|
#
|
|
|
|
. $STF_SUITE/tests/functional/redacted_send/redacted.kshlib
|
|
|
|
#
|
|
# Description:
|
|
# Verify that incrementals (redacted and normal) work with redacted datasets.
|
|
#
|
|
# Strategy:
|
|
# 1. Test normal incrementals from the original snap to a subset of the
|
|
# redaction list.
|
|
# 2. Test receipt of intermediate clones, and their children.
|
|
# 3. Test receipt with origin snap specified by '-o origin='.
|
|
# 4. Test incrementals from redaction bookmarks.
|
|
#
|
|
|
|
typeset ds_name="incrementals"
|
|
typeset sendfs="$POOL/$ds_name"
|
|
typeset recvfs="$POOL2/$ds_name"
|
|
typeset clone="$POOL/${ds_name}_clone"
|
|
typeset tmpdir="$(get_prop mountpoint $POOL)/tmp"
|
|
typeset stream=$(mktemp $tmpdir/stream.XXXX)
|
|
setup_dataset $ds_name '' setup_incrementals
|
|
typeset clone_mnt="$(get_prop mountpoint $clone)"
|
|
typeset send_mnt="$(get_prop mountpoint $sendfs)"
|
|
typeset recv_mnt="/$POOL2/$ds_name"
|
|
|
|
log_onexit redacted_cleanup $sendfs $recvfs $POOL2/rfs
|
|
|
|
# Setup a redacted send using a redaction list at varying depth.
|
|
log_must zfs redact $sendfs@snap0 book1 $POOL/rm@snap $POOL/stride3@snap \
|
|
$POOL/stride5@snap
|
|
log_must eval "zfs send --redact book1 $sendfs@snap0 >$stream"
|
|
log_must eval "zfs receive $POOL2/rfs <$stream"
|
|
|
|
# Verify receipt of normal incrementals to redaction list members.
|
|
log_must eval "zfs send -i $sendfs@snap0 $POOL/stride3@snap >$stream"
|
|
log_must eval "zfs recv $POOL2/rstride3 <$stream"
|
|
log_must diff -r /$POOL/stride3 /$POOL2/rstride3
|
|
log_must eval "zfs send -i $sendfs@snap0 $POOL/stride5@snap >$stream"
|
|
log_must eval "zfs recv $POOL2/rstride5 <$stream"
|
|
log_must diff -r /$POOL/stride5 /$POOL2/rstride5
|
|
|
|
# But not a normal child that we weren't redacted with respect to.
|
|
log_must eval "zfs send -i $sendfs@snap0 $POOL/hole@snap >$stream"
|
|
log_mustnot eval "zfs recv $POOL2/rhole@snap <$stream"
|
|
|
|
# Verify we can receive an intermediate clone redacted with respect to a
|
|
# subset of the original redaction list.
|
|
log_must zfs redact $POOL/int@snap book2 $POOL/rm@snap
|
|
log_must eval "zfs send -i $sendfs@snap0 --redact book2 $POOL/int@snap >$stream"
|
|
log_must eval "zfs recv $POOL2/rint <$stream"
|
|
compare_files $POOL/int $POOL2/rint "f1" "$RANGE0"
|
|
compare_files $POOL/int $POOL2/rint "f2" "$RANGE15"
|
|
compare_files $POOL/int $POOL2/rint "d1/f1" "$RANGE16"
|
|
log_must mount_redacted -f $POOL2/rint
|
|
|
|
# Verify we can receive grandchildren on the child.
|
|
log_must eval "zfs send -i $POOL/int@snap $POOL/rm@snap >$stream"
|
|
log_must eval "zfs receive $POOL2/rrm <$stream"
|
|
log_must diff -r /$POOL/rm /$POOL2/rrm
|
|
|
|
# But not a grandchild that the received child wasn't redacted with respect to.
|
|
log_must eval "zfs send -i $POOL/int@snap $POOL/write@snap >$stream"
|
|
log_mustnot eval "zfs recv $POOL2/rwrite<$stream"
|
|
|
|
# Verify we cannot receive an intermediate clone that isn't redacted with
|
|
# respect to a subset of the original redaction list.
|
|
log_must zfs redact $POOL/int@snap book4 $POOL/rm@snap $POOL/write@snap
|
|
log_must eval "zfs send -i $sendfs@snap0 --redact book4 $POOL/int@snap >$stream"
|
|
log_mustnot eval "zfs recv $POOL2/rint <$stream"
|
|
log_must zfs redact $POOL/int@snap book5 $POOL/write@snap
|
|
log_must eval "zfs send -i $sendfs@snap0 --redact book5 $POOL/int@snap >$stream"
|
|
log_mustnot eval "zfs recv $POOL2/rint <$stream"
|
|
log_mustnot zfs redact $POOL/int@snap book6 $POOL/hole@snap
|
|
|
|
# Verify we can receive a full clone of the grandchild on the child.
|
|
log_must eval "zfs send $POOL/write@snap >$stream"
|
|
log_must eval "zfs recv -o origin=$POOL2/rint@snap $POOL2/rwrite <$stream"
|
|
log_must diff -r /$POOL/write /$POOL2/rwrite
|
|
|
|
# Along with other origins.
|
|
log_must eval "zfs recv -o origin=$POOL2/rfs@snap0 $POOL2/rwrite1 <$stream"
|
|
log_must diff -r /$POOL/write /$POOL2/rwrite1
|
|
log_must eval "zfs recv -o origin=$POOL2@init $POOL2/rwrite2 <$stream"
|
|
log_must diff -r /$POOL/write /$POOL2/rwrite2
|
|
log_must zfs destroy -R $POOL2/rwrite2
|
|
|
|
log_must zfs destroy -R $POOL2/rfs
|
|
|
|
# Write some data for tests of incremental sends from bookmarks
|
|
log_must zfs snapshot $sendfs@snap1
|
|
log_must zfs clone $sendfs@snap1 $POOL/hole1
|
|
typeset mntpnt=$(get_prop mountpoint $POOL/hole1)
|
|
log_must dd if=/dev/zero of=$mntpnt/f2 bs=128k count=16 conv=notrunc
|
|
log_must zfs snapshot $POOL/hole1@snap
|
|
log_must zfs clone $sendfs@snap1 $POOL/write1
|
|
mntpnt=$(get_prop mountpoint $POOL/write1)
|
|
log_must dd if=/dev/urandom of=$mntpnt/f2 bs=128k count=16 conv=notrunc
|
|
log_must zfs snapshot $POOL/write1@snap
|
|
log_must zfs clone $POOL/int@snap $POOL/write2
|
|
mntpnt=$(get_prop mountpoint $POOL/write2)
|
|
log_must dd if=/dev/urandom of=$mntpnt/f2 bs=128k count=16 conv=notrunc
|
|
log_must zfs snapshot $POOL/write2@snap
|
|
|
|
# Setup a redacted send using a redaction list at varying depth.
|
|
log_must zfs redact $sendfs@snap0 book7 $POOL/rm@snap $POOL/stride3@snap \
|
|
$POOL/stride5@snap
|
|
log_must eval "zfs send --redact book7 $sendfs@snap0 >$stream"
|
|
log_must eval "zfs receive $POOL2/rfs <$stream"
|
|
|
|
# Verify we can receive a redacted incremental sending from the bookmark.
|
|
log_must zfs redact $sendfs@snap1 book8 $POOL/write1@snap
|
|
log_must eval "zfs send -i $sendfs#book7 --redact book8 $sendfs@snap1 >$stream"
|
|
log_must eval "zfs receive $POOL2/rfs <$stream"
|
|
# The stride3 and stride5 snaps redact 3 128k blocks at block offsets 0 15 and
|
|
# 30 of f2. The write1 snap only covers the first two of those three blocks.
|
|
compare_files $sendfs $POOL2/rfs "f2" "$RANGE12"
|
|
log_must mount_redacted -f $POOL2/rfs
|
|
log_must diff $send_mnt/f1 /$POOL2/rfs/f1
|
|
log_must diff $send_mnt/d1/f1 /$POOL2/rfs/d1/f1
|
|
unmount_redacted $POOL2/rfs
|
|
|
|
# Verify we can receive a normal child we weren't redacted with respect to by
|
|
# sending from the bookmark.
|
|
log_must eval "zfs send -i $sendfs#book7 $POOL/hole1@snap >$stream"
|
|
log_must eval "zfs recv $POOL2/rhole1 <$stream"
|
|
log_must diff -r /$POOL/hole1 /$POOL2/rhole1
|
|
|
|
# Verify we can receive an intermediate clone redacted with respect to a
|
|
# non-subset if we send from the bookmark.
|
|
log_must zfs redact $POOL/int@snap book9 $POOL/write2@snap
|
|
log_must eval "zfs send -i $sendfs#book7 --redact book9 $POOL/int@snap >$stream"
|
|
log_must eval "zfs receive $POOL2/rint <$stream"
|
|
compare_files $sendfs $POOL2/rint "f2" "$RANGE12"
|
|
|
|
log_pass "Incrementals (redacted and normal) work with redacted datasets."
|