#!/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) 2017, 2018 by Delphix. All rights reserved. # . $STF_SUITE/tests/functional/redacted_send/redacted.kshlib # # Description: # Verify redaction works as expected with respect to deleted files # # Strategy: # 1. A file on the delete queue counts as deleted when using it to calculate # redaction. # 2. A file that is removed in the tosnap of an incremental, where the fromsnap # is a redaction bookmark that contains references to that file, does not # result in records for that file. # typeset ds_name="deleted" typeset sendfs="$POOL/$ds_name" typeset recvfs="$POOL2/$ds_name" typeset clone="$POOL/${ds_name}_clone" typeset clone2="$POOL/${ds_name}_clone2" typeset tmpdir="$(get_prop mountpoint $POOL)/tmp" typeset stream=$(mktemp $tmpdir/stream.XXXX) setup_dataset $ds_name '' 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 # # A file on the delete queue counts as deleted when using it to calculate # redaction. # # # Open file descriptor 5 for appending to $clone_mnt/f1 so that it will go on # the delete queue when we rm it. # exec 5>>$clone_mnt/f1 log_must dd if=/dev/urandom of=$clone_mnt/f1 bs=512 count=1 conv=notrunc log_must rm $clone_mnt/f1 log_must zfs snapshot $clone@snap1 # Close file descriptor 5 exec 5>&- log_must zfs redact $sendfs@snap book1 $clone@snap1 log_must eval "zfs send --redact book1 $sendfs@snap >$stream" log_must eval "zfs recv $recvfs <$stream" log_must mount_redacted -f $recvfs # # We have temporarily disabled redaction blkptrs, so this will not # fail as was originally intended. We should uncomment this line # when we re-enable redaction blkptrs. # #log_mustnot dd if=$recv_mnt/f1 of=/dev/null bs=512 count=1 log_must diff $send_mnt/f2 $recv_mnt/f2 log_must zfs rollback -R $clone@snap log_must zfs destroy -R $recvfs # # A file that is removed in the tosnap of an incremental, where the fromsnap # is a redaction bookmark that contains references to that file, does not # result in records for that file. # log_must zfs clone $sendfs@snap $clone2 typeset clone2_mnt="$(get_prop mountpoint $clone2)" log_must rm -rf $clone2_mnt/* log_must zfs snapshot $clone2@snap log_must zfs redact $sendfs@snap book2 $clone2@snap log_must zfs destroy -R $clone2 log_must eval "zfs send --redact book2 $sendfs@snap >$stream" log_must eval "zfs recv $recvfs <$stream" log_must rm $send_mnt/f1 log_must zfs snapshot $sendfs@snap2 log_must zfs clone $sendfs@snap2 $clone2 typeset clone2_mnt="$(get_prop mountpoint $clone2)" log_must rm $clone2_mnt/* log_must zfs snapshot $clone2@snap log_must zfs redact $sendfs@snap2 book3 $clone2@snap log_must zfs destroy -R $clone2 log_must eval "zfs send -i $sendfs#book2 --redact book3 $sendfs@snap2 >$stream" log_must eval "zfs recv $recvfs <$stream" log_must mount_redacted -f $recvfs log_must diff <(ls $send_mnt) <(ls $recv_mnt) log_must zfs destroy -R $recvfs log_must zfs rollback -R $sendfs@snap log_pass "Verify Redaction works as expected with respect to deleted files."