]> git.proxmox.com Git - mirror_zfs.git/commitdiff
ZTS: avoid piping to special devices
authorAntonio Russo <aerusso@aerusso.net>
Tue, 19 Jan 2021 19:53:35 +0000 (12:53 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Sat, 23 Jan 2021 23:47:06 +0000 (15:47 -0800)
As described in #11445, the kernel interface kernel_{read,write} no
longer act on special devices.  In the ZTS, zfs send and receive are
tested by piping to these devices, leading to spurious failures (for
positive tests) and may mask errors (for negative tests).

Until a more permanent mechanism to address this deficiency is
developed, clean up the output from the ZTS by avoiding directly piping
to or from /dev/null and /dev/zero.

For /dev/zero input, simply use a pipe: `cat </dev/zero |` .

However, for /dev/null output, the shell semantics for pipe failures
means that zfs send error codes will be masked by the successful
`| cat >/dev/null` command execution.  In that case, use a temporary
file under $TEST_BASE_DIR for output in favor.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Attila Fülöp <attila@fueloep.org>
Signed-off-by: Antonio Russo <aerusso@aerusso.net>
Closes #11478

14 files changed:
contrib/pyzfs/libzfs_core/test/test_libzfs_core.py
tests/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_005_neg.ksh
tests/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send-b.ksh
tests/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_003_pos.ksh
tests/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_004_neg.ksh
tests/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_005_pos.ksh
tests/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_encrypted.ksh
tests/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_encrypted_unloaded.ksh
tests/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_raw.ksh
tests/zfs-tests/tests/functional/redacted_send/redacted_negative.ksh
tests/zfs-tests/tests/functional/redacted_send/redacted_resume.ksh
tests/zfs-tests/tests/functional/removal/removal_with_send.ksh
tests/zfs-tests/tests/functional/rsend/send_invalid.ksh
tests/zfs-tests/tests/functional/rsend/send_partial_dataset.ksh

index a841f96af36f648ad92730e41bc3c334c8b908f5..08b58b5d1e0de2cad97be1331cc4f554a0fc50f4 100644 (file)
@@ -154,8 +154,8 @@ def os_open(name, mode):
 
 @contextlib.contextmanager
 def dev_null():
-    with os_open('/dev/null', os.O_WRONLY) as fd:
-        yield fd
+    with tempfile.TemporaryFile(suffix='.zstream') as fd:
+        yield fd.fileno()
 
 
 @contextlib.contextmanager
index 4cbc7e339031091f7a515ec3d06ee7c4ffc5ec56..ce89c6835775b168a4c22c003001e9ff731f30ae 100755 (executable)
@@ -82,8 +82,8 @@ log_must zfs snapshot $init_snap
 log_must eval "zfs send $init_snap > $full_bkup"
 
 log_note "'zfs receive' fails with invalid send streams."
-log_mustnot eval "zfs receive $rst_init_snap < /dev/zero"
-log_mustnot eval "zfs receive -d $rst_root </dev/zero"
+log_mustnot eval "cat </dev/zero | zfs receive $rst_init_snap"
+log_mustnot eval "cat </dev/zero | zfs receive -d $rst_root"
 
 log_must eval "zfs receive $rst_init_snap < $full_bkup"
 
index 87997e76c24542eee61f26627e05bf09a5b1677c..2105bc4d23e4e5e9edbff0312efb420d2562f9e9 100755 (executable)
@@ -58,13 +58,13 @@ log_must zfs set "org.openzfs:snapprop=val" "$SENDFS@s1"
 # 2. Verify command line options interact with '-b' correctly
 typeset opts=("" "p" "Rp" "cew" "nv" "D" "DLPRcenpvw")
 for opt in ${opts[@]}; do
-       log_must eval "zfs send -b$opt $SENDFS@s1 > /dev/null"
-       log_must eval "zfs send -b$opt -i $SENDFS@s1 $SENDFS@s2 > /dev/null"
-       log_must eval "zfs send -b$opt -I $SENDFS@s1 $SENDFS@s2 > /dev/null"
+       log_must eval "zfs send -b$opt $SENDFS@s1 >$TEST_BASE_DIR/devnull"
+       log_must eval "zfs send -b$opt -i $SENDFS@s1 $SENDFS@s2 >$TEST_BASE_DIR/devnull"
+       log_must eval "zfs send -b$opt -I $SENDFS@s1 $SENDFS@s2 >$TEST_BASE_DIR/devnull"
 done
 for opt in ${opts[@]}; do
-       log_mustnot eval "zfs send -b$opt $SENDFS > /dev/null"
-       log_mustnot eval "zfs send -b$opt $SENDFS#bm > /dev/null"
+       log_mustnot eval "zfs send -b$opt $SENDFS >$TEST_BASE_DIR/devnull"
+       log_mustnot eval "zfs send -b$opt $SENDFS#bm >$TEST_BASE_DIR/devnull"
 done
 
 # Do 3..6 in a loop to verify various combination of "zfs send" options
index 825a10d0f8a2b5722bdae41650103a382c271af9..0b55254f75d6781711729c06645115fe9833eaac 100755 (executable)
@@ -61,7 +61,7 @@ log_must zfs snapshot $snap2
 
 typeset -i i=0
 while (( i < ${#args[*]} )); do
-       log_must eval "zfs send -i ${args[i]} > /dev/null"
+       log_must eval "zfs send -i ${args[i]} >$TEST_BASE_DIR/devnull"
 
        (( i += 1 ))
 done
index 4a9d29fce1cf680e554b73f3fd2440a70240b6f2..dfa9fc251d6bcc953423064ed21348177dfb5706 100755 (executable)
@@ -96,7 +96,7 @@ log_must zfs snapshot $snap3
 typeset -i i=0
 while (( i < ${#badargs[*]} ))
 do
-       log_mustnot eval "zfs send ${badargs[i]} >/dev/null"
+       log_mustnot eval "zfs send ${badargs[i]} >$TEST_BASE_DIR/devnull"
 
        (( i = i + 1 ))
 done
index 9f369e372dee283e0be124d026a61838ad36f00a..c9e37cbbad8e9e578bab60d2e601b24d431b1e22 100755 (executable)
@@ -61,6 +61,6 @@ log_must zfs snapshot -r $TESTPOOL@snap
 log_must zpool export $TESTPOOL
 log_must zpool import -o readonly=on $TESTPOOL
 
-log_must eval "zfs send -R $TESTPOOL@snap >/dev/null"
+log_must eval "zfs send -R $TESTPOOL@snap >$TEST_BASE_DIR/devnull"
 
 log_pass "'zfs send -R' can send from read-only pools"
index 490e146ba6f0953f35902d739712c48131a3ac22..1e63b29ade1fad2995bdfe4f9673800514320861 100755 (executable)
@@ -62,15 +62,15 @@ log_must eval "echo $passphrase1 | zfs create -o encryption=on" \
 
 log_must zfs snapshot -r $snap
 
-log_must eval "zfs send $snap > /dev/null"
-log_mustnot eval "zfs send -p $snap > /dev/null"
-log_mustnot eval "zfs send -R $snap > /dev/null"
+log_must eval "zfs send $snap >$TEST_BASE_DIR/devnull"
+log_mustnot eval "zfs send -p $snap >$TEST_BASE_DIR/devnull"
+log_mustnot eval "zfs send -R $snap >$TEST_BASE_DIR/devnull"
 
 log_must zfs unmount $TESTPOOL/$TESTFS1
 log_must zfs unload-key $TESTPOOL/$TESTFS1
 
-log_mustnot eval "zfs send $snap > /dev/null"
-log_must eval "zfs send $TESTPOOL/$TESTFS1/child@snap > /dev/null"
+log_mustnot eval "zfs send $snap >$TEST_BASE_DIR/devnull"
+log_must eval "zfs send $TESTPOOL/$TESTFS1/child@snap >$TEST_BASE_DIR/devnull"
 
 log_pass "ZFS performs unencrypted sends of encrypted datasets, unless the" \
        "'-p' or '-R' options are specified"
index 112ee1143d106bc3f65b16a104ae2bb38aa6bcee..9d59494fc635ff5af22f1540bff3ed78ef25daab 100755 (executable)
@@ -53,7 +53,7 @@ log_must eval "echo $passphrase | zfs create -o encryption=on" \
 log_must zfs snapshot $snap
 log_must zfs unmount $TESTPOOL/$TESTFS1
 log_must zfs unload-key $TESTPOOL/$TESTFS1
-log_mustnot eval "zfs send $snap > /dev/null"
+log_mustnot eval "zfs send $snap >$TEST_BASE_DIR/devnull"
 
 log_pass "ZFS does not perform unencrypted sends from encrypted datasets" \
        "with unloaded keys."
index 85cc7407e1a14470ac70a304a9b29700a357377b..065eea3ebd86fc4bc238df6b2d47d0bda3b3e9ee 100755 (executable)
@@ -59,21 +59,21 @@ log_must eval "echo $passphrase | zfs create -o encryption=on" \
 log_must zfs snapshot $snap
 log_must zfs snapshot $snap1
 
-log_must eval "zfs send -w $snap > /dev/null"
-log_must eval "zfs send -w $snap1 > /dev/null"
+log_must eval "zfs send -w $snap >$TEST_BASE_DIR/devnull"
+log_must eval "zfs send -w $snap1 >$TEST_BASE_DIR/devnull"
 
 log_note "Verify ZFS can perform raw sends with properties"
-log_must eval "zfs send -wp $snap > /dev/null"
-log_must eval "zfs send -wp $snap1 > /dev/null"
+log_must eval "zfs send -wp $snap >$TEST_BASE_DIR/devnull"
+log_must eval "zfs send -wp $snap1 >$TEST_BASE_DIR/devnull"
 
 log_note "Verify ZFS can perform raw replication sends"
-log_must eval "zfs send -wR $snap > /dev/null"
-log_must eval "zfs send -wR $snap1 > /dev/null"
+log_must eval "zfs send -wR $snap >$TEST_BASE_DIR/devnull"
+log_must eval "zfs send -wR $snap1 >$TEST_BASE_DIR/devnull"
 
 log_note "Verify ZFS can perform a raw send of an encrypted datasets with" \
        "its key unloaded"
 log_must zfs unmount $TESTPOOL/$TESTFS1
 log_must zfs unload-key $TESTPOOL/$TESTFS1
-log_must eval "zfs send -w $snap1 > /dev/null"
+log_must eval "zfs send -w $snap1 >$TEST_BASE_DIR/devnull"
 
 log_pass "ZFS performs raw sends of datasets"
index 432460fa2fcdc1b2510c3799e8c97c6c7478794c..e591cca0bbded141d8691990cce264f5189e322b 100755 (executable)
@@ -45,11 +45,11 @@ log_must zfs snapshot $clone2@snap
 
 # Incompatible flags
 log_must zfs redact $sendfs@snap2 book $clone1@snap
-log_mustnot eval "zfs send -R --redact book $sendfs@snap2 >/dev/null"
+log_mustnot eval "zfs send -R --redact book $sendfs@snap2 >$TEST_BASE_DIR/devnull"
 
 typeset arg
 for arg in "$sendfs" "$clone1#book"; do
-       log_mustnot eval "zfs send --redact book $arg >/dev/null"
+       log_mustnot eval "zfs send --redact book $arg >$TEST_BASE_DIR/devnull"
 done
 
 # Bad redaction list arguments
@@ -58,7 +58,7 @@ log_mustnot zfs redact $sendfs@snap1 book
 log_mustnot zfs redact $sendfs#book1 book4 $clone1
 log_mustnot zfs redact $sendfs@snap1 book snap2 snap3
 log_mustnot zfs redact $sendfs@snap1 book @snap2 @snap3
-log_mustnot eval "zfs send --redact $sendfs#book $sendfs@snap >/dev/null"
+log_mustnot eval "zfs send --redact $sendfs#book $sendfs@snap >$TEST_BASE_DIR/devnull"
 
 # Redaction snapshots not a descendant of tosnap
 log_mustnot zfs redact $sendfs@snap2 book $sendfs@snap2
@@ -66,7 +66,7 @@ log_must zfs redact $sendfs@snap2 book2 $clone1@snap $clone2@snap
 log_must eval "zfs send --redact book2 $sendfs@snap2 >$stream"
 log_must zfs redact $sendfs@snap2 book3 $clone1@snap $clone2@snap
 log_must eval "zfs send -i $sendfs@snap1 --redact book3 $sendfs@snap2 \
-    >/dev/null"
+    >$TEST_BASE_DIR/devnull"
 log_mustnot zfs redact $sendfs@snap3 $sendfs@snap3 $clone1@snap
 
 # Full redacted sends of redacted datasets are not allowed.
index 8118ea59ec8b90e89e69fd4d9f70229219d34fd3..4ab04a0e5730646820b892f991ee8fda645fe7b8 100755 (executable)
@@ -81,7 +81,7 @@ log_must eval "zfs send --redact book1 $sendfs@snap >$stream"
 dd if=$stream bs=64k count=1 | log_mustnot zfs receive -s $recvfs
 [[ "-" = $(get_prop receive_resume_token $recvfs) ]] && \
     log_fail "Receive token not found."
-log_mustnot eval "zfs send --saved --redact book1 $recvfs > /dev/null"
+log_mustnot eval "zfs send --saved --redact book1 $recvfs >$TEST_BASE_DIR/devnull"
 log_must zfs recv -A $recvfs
 log_must datasetnonexists $recvfs
 
index 59e66aca5256ea7546d6a8e02785a927a810dd1e..a08247838105388227c657de1e3f4464dc22c6ae 100755 (executable)
@@ -28,7 +28,7 @@ function callback
 {
        create_snapshot $TESTPOOL/$TESTFS $TESTSNAP
        log_must ksh -c \
-           "zfs send $TESTPOOL/$TESTFS@$TESTSNAP >/dev/null"
+           "zfs send $TESTPOOL/$TESTFS@$TESTSNAP >$TEST_BASE_DIR/devnull"
        return 0
 }
 
index a0abe64b4cca4ce2464ec1c038c04377dad763a3..2ce7ee4a082ff107ead7005c3ade53c1d22e9f72 100755 (executable)
@@ -44,7 +44,7 @@ log_must zfs snap $testfs@snap0
 log_must zfs snap $testfs@snap1
 
 # Test bad send with the CLI
-log_mustnot eval "zfs send -i $testfs@snap1 $testfs@snap0 >/dev/null"
+log_mustnot eval "zfs send -i $testfs@snap1 $testfs@snap0 >$TEST_BASE_DIR/devnull"
 
 # Test bad send with libzfs/libzfs_core
 log_must badsend $testfs@snap0 $testfs@snap1
index d5eb9a0edc112c3e045a2349334ed67caa8a26e4..c390327a5b573cac3fce510e5ca24a085f22694f 100755 (executable)
@@ -103,7 +103,7 @@ set -A badargs \
 
 while (( i < ${#badargs[*]} ))
 do
-       log_mustnot eval "zfs send --saved ${badargs[i]} >/dev/null"
+       log_mustnot eval "zfs send --saved ${badargs[i]} >$TEST_BASE_DIR/devnull"
        (( i = i + 1 ))
 done