-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix issues with raw receive_write_byref()
This patch fixes 2 issues with raw, deduplicated send streams. The first is that datasets who had been completely received earlier in the stream were not still marked as raw receives. This caused problems when newly received datasets attempted to fetch raw data from these datasets without this flag set. The second problem was that the arc freeze checksum code was not consistent about which locks needed to be held while performing its asserts. The code now guarantees that the hdr lock is held when iterating through the linked list of buffers and the b_freeze_lock is held when attempting to read or modify the b_freeze_cksum. This is not strictly a problem with the write_byref code, but it seems to be the only consistent code path to trigger the issue. Signed-off-by: Tom Caputi <tcaputi@datto.com>
- Loading branch information
Tom Caputi
committed
Jul 11, 2018
1 parent
00c405b
commit 855fd78
Showing
7 changed files
with
138 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
95 changes: 95 additions & 0 deletions
95
tests/zfs-tests/tests/functional/rsend/send-wDR_encrypted_zvol.ksh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
#!/bin/ksh -p | ||
# | ||
# CDDL HEADER START | ||
# | ||
# 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. | ||
# | ||
# CDDL HEADER END | ||
# | ||
|
||
# | ||
# Copyright (c) 2018 by Datto Inc. All rights reserved. | ||
# | ||
|
||
. $STF_SUITE/tests/functional/rsend/rsend.kshlib | ||
|
||
# | ||
# DESCRIPTION: | ||
# Verify that zvols with dedup=on and encryption=on can be sent and received | ||
# with a deduplicated raw send stream. | ||
# | ||
# STRATEGY: | ||
# 1. Create a zvol with dedup and encryption on and put a filesystem on it | ||
# 2. Copy a file into the zvol a few times and take a snapshot | ||
# 3. Repeat step 2 a few times to create more snapshots | ||
# 4. Send all snapshots in a recursive, raw, deduplicated send stream | ||
# 5. Mount the received zvol and verify that all of the data there is correct | ||
# | ||
|
||
verify_runnable "both" | ||
|
||
function cleanup | ||
{ | ||
ismounted $recvmnt ext4 && log_must umount $recvmnt | ||
ismounted $mntpnt ext4 && log_must umount $mntpnt | ||
[[ -d $recvmnt ]] && log_must rm -rf $keyfile | ||
[[ -d $mntpnt ]] && log_must rm -rf $keyfile | ||
datasetexists $TESTPOOL/recv && \ | ||
log_must zfs destroy -r $TESTPOOL/recv | ||
datasetexists $TESTPOOL/$TESTVOL && \ | ||
log_must zfs destroy -r $TESTPOOL/$TESTVOL | ||
[[ -f $keyfile ]] && log_must rm $keyfile | ||
[[ -f $sendfile ]] && log_must rm $sendfile | ||
} | ||
log_onexit cleanup | ||
|
||
log_assert "Verify zfs can receive raw, recursive, and deduplicated send streams" | ||
|
||
typeset keyfile=/$TESTPOOL/pkey | ||
typeset snap_count=5 | ||
typeset zdev=$ZVOL_DEVDIR/$TESTPOOL/$TESTVOL | ||
typeset mntpnt=$TESTDIR/$TESTVOL | ||
typeset recvdev=$ZVOL_DEVDIR/$TESTPOOL/recv | ||
typeset recvmnt=$TESTDIR/recvmnt | ||
typeset sendfile=$TESTDIR/sendfile | ||
|
||
log_must eval "echo 'password' > $keyfile" | ||
|
||
log_must zfs create -o dedup=on -o encryption=on -o keyformat=passphrase \ | ||
-o keylocation=file://$keyfile -V 128M $TESTPOOL/$TESTVOL | ||
log_must block_device_wait | ||
|
||
log_must eval "echo 'y' | newfs -t ext4 -v $zdev" | ||
log_must mkdir -p $mntpnt | ||
log_must mkdir -p $recvmnt | ||
log_must mount $zdev $mntpnt | ||
|
||
for ((i = 1; i <= $snap_count; i++)); do | ||
log_must dd if=/dev/urandom of=$mntpnt/file bs=1M count=1 | ||
for ((j = 0; j < 10; j++)); do | ||
log_must cp $mntpnt/file $mntpnt/file$j | ||
done | ||
|
||
log_must sync | ||
log_must zfs snap $TESTPOOL/$TESTVOL@snap$i | ||
done | ||
|
||
log_must eval "zfs send -wDR $TESTPOOL/$TESTVOL@snap$snap_count > $sendfile" | ||
log_must eval "zfs recv $TESTPOOL/recv < $sendfile" | ||
log_must zfs load-key $TESTPOOL/recv | ||
log_must block_device_wait | ||
|
||
log_must mount $recvdev $recvmnt | ||
|
||
md5_1=$(cat $mntpnt/* | md5sum | awk '{print $1}') | ||
md5_2=$(cat $recvmnt/* | md5sum | awk '{print $1}') | ||
[[ "$md5_1" == "$md5_2" ]] || log_fail "md5 mismatch: $md5_1 != $md5_2" | ||
|
||
log_pass "zfs can receive raw, recursive, and deduplicated send streams" |