1#!/bin/ksh 2 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) 2019 by Lawrence Livermore National Security, LLC. 16# 17 18. $STF_SUITE/include/libtest.shlib 19. $STF_SUITE/tests/functional/rsend/rsend.kshlib 20 21# 22# Description: 23# Verify encrypted raw incremental receives handle dnode reallocation. 24 25# Strategy: 26# 1. Create a pool containing an encrypted filesystem. 27# 2. Use 'zfs send -wp' to perform a raw send of the initial filesystem. 28# 3. Repeat the followings steps N times to verify raw incremental receives. 29# a) Randomly change several key dataset properties. 30# b) Modify the contents of the filesystem such that dnode reallocation 31# is likely during the 'zfs receive', and receive_object() exercises 32# as much of its functionality as possible. 33# c) Create a new snapshot and generate an raw incremental stream. 34# d) Receive the raw incremental stream and verify the received contents. 35# e) Destroy the incremental stream and old snapshot. 36# 37 38verify_runnable "both" 39 40log_assert "Verify encrypted raw incremental receive handles reallocation" 41 42function cleanup 43{ 44 rm -f $BACKDIR/fs@* 45 rm -f $keyfile 46 destroy_dataset $POOL/fs "-rR" 47 destroy_dataset $POOL/newfs "-rR" 48} 49 50log_onexit cleanup 51 52typeset keyfile=/$TESTPOOL/pkey 53 54# Create an encrypted dataset 55log_must eval "echo 'password' > $keyfile" 56log_must zfs create -o encryption=on -o keyformat=passphrase \ 57 -o keylocation=file://$keyfile $POOL/fs 58 59last_snap=1 60log_must zfs snapshot $POOL/fs@snap${last_snap} 61log_must eval "zfs send -wp $POOL/fs@snap${last_snap} \ 62 >$BACKDIR/fs@snap${last_snap}" 63log_must eval "zfs recv $POOL/newfs < $BACKDIR/fs@snap${last_snap}" 64 65# Set atime=off to prevent the recursive_cksum from modifying newfs. 66log_must zfs set atime=off $POOL/newfs 67 68for i in {1..5}; do 69 # Randomly modify several dataset properties in order to generate 70 # more interesting incremental send streams. 71 rand_set_prop $POOL/fs checksum "off" "fletcher4" "sha256" 72 rand_set_prop $POOL/fs compression "off" "lzjb" "gzip" "lz4" 73 rand_set_prop $POOL/fs recordsize "32K" "128K" 74 rand_set_prop $POOL/fs dnodesize "legacy" "auto" "4k" 75 76 # Churn the filesystem in such a way that we're likely to be both 77 # allocating and reallocating objects in the incremental stream. 78 # 79 # Disable xattrs until the following spill block issue is resolved: 80 # https://github.com/openzfs/openzfs/pull/705 81 # 82 log_must churn_files 1000 524288 $POOL/fs 0 83 expected_cksum=$(recursive_cksum /$fs) 84 85 # Create a snapshot and use it to send an incremental stream. 86 this_snap=$((last_snap + 1)) 87 log_must zfs snapshot $POOL/fs@snap${this_snap} 88 log_must eval "zfs send -wp -i $POOL/fs@snap${last_snap} \ 89 $POOL/fs@snap${this_snap} > $BACKDIR/fs@snap${this_snap}" 90 91 # Receive the incremental stream and verify the received contents. 92 log_must eval "zfs recv -Fu $POOL/newfs < $BACKDIR/fs@snap${this_snap}" 93 94 log_must zfs load-key $POOL/newfs 95 log_must zfs mount $POOL/newfs 96 actual_cksum=$(recursive_cksum /$POOL/newfs) 97 log_must zfs umount $POOL/newfs 98 log_must zfs unload-key $POOL/newfs 99 100 if [[ "$expected_cksum" != "$actual_cksum" ]]; then 101 log_fail "Checksums differ ($expected_cksum != $actual_cksum)" 102 fi 103 104 # Destroy the incremental stream and old snapshot. 105 rm -f $BACKDIR/fs@snap${last_snap} 106 log_must zfs destroy $POOL/fs@snap${last_snap} 107 log_must zfs destroy $POOL/newfs@snap${last_snap} 108 last_snap=$this_snap 109done 110 111log_pass "Verify encrypted raw incremental receive handles reallocation" 112