From 1da65fc037b049cb56c1343eea38510ff068f844 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Wed, 20 May 2020 16:06:27 +0100 Subject: [PATCH] Add upstream patch to make tests/test-truncate4.sh more stable on s390x. --- ...st-truncate4.sh-Rewrite-to-use-nbdsh.patch | 167 ++++++++++++++++++ nbdkit.spec | 8 +- 2 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 0001-tests-test-truncate4.sh-Rewrite-to-use-nbdsh.patch diff --git a/0001-tests-test-truncate4.sh-Rewrite-to-use-nbdsh.patch b/0001-tests-test-truncate4.sh-Rewrite-to-use-nbdsh.patch new file mode 100644 index 0000000..cd6bf8f --- /dev/null +++ b/0001-tests-test-truncate4.sh-Rewrite-to-use-nbdsh.patch @@ -0,0 +1,167 @@ +From 0632acc76bfeb7d70d3eefa42fc842ce6b7be4f8 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Wed, 20 May 2020 13:27:27 +0100 +Subject: [PATCH] tests/test-truncate4.sh: Rewrite to use nbdsh. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The old test relied on issuing an asynchronous command to a qemu-io +subprocess, requiring a sleep to ensure that the command had been +carried out. ‘sleep 1’ was not long enough on s390x as you can see +from this partial trace: + + + exec + + qemu-io -f raw nbd:unix:/tmp/tmp.jqOZGj6dnX + + exec + + echo 'Reading from connection A, try 1' + Reading from connection A, try 1 + + echo 'r -P 1 0 1024' + + sleep 1 + +Above we issue the command and sleep while it executes. However: + + nbdkit: debug: accepted connection + nbdkit: file[1]: debug: truncate: preconnect + nbdkit: file[1]: debug: file: preconnect + nbdkit: file[1]: debug: newstyle negotiation: flags: global 0x3 + + echo 'Resizing down' + Resizing down + + truncate -s 512 truncate4.data + nbdkit: file[1]: debug: newstyle negotiation: client flags: 0x3 + nbdkit: file[1]: debug: newstyle negotiation: NBD_OPT_STRUCTURED_REPLY: client requested structured replies + +Here are still connecting to nbdkit from "connection A", long after +the sleep has finished and the truncate has been done. + +Instead of increasing the sleep and hoping for the best, I chose to +rewrite the test to use nbdsh. This allows us to control both +connections from a single process, making the test predicatable and +easier to understand. +--- + tests/test-truncate4.sh | 85 +++++++++++++++++++++++++---------------- + 1 file changed, 53 insertions(+), 32 deletions(-) + +diff --git a/tests/test-truncate4.sh b/tests/test-truncate4.sh +index e4be626b..36b2743c 100755 +--- a/tests/test-truncate4.sh ++++ b/tests/test-truncate4.sh +@@ -1,6 +1,6 @@ + #!/usr/bin/env bash + # nbdkit +-# Copyright (C) 2019 Red Hat Inc. ++# Copyright (C) 2019-2020 Red Hat Inc. + # + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions are +@@ -31,55 +31,76 @@ + # SUCH DAMAGE. + + # Regression test when next_ops->get_size changes between connections. ++# + # For now, NBD does not support dynamic resize; but the file plugin + # reads size from the file system for each new connection, at which + # point the client remembers that size for the life of the connection. ++# + # We are testing that connection A can still see the tail of a file, + # even when connection B is opened while the file was temporarily +-# shorter (if the actions of connection B affect the size visible +-# through connection A, we didn't isolate per-connection state). ++# shorter. If the actions of connection B affect the size visible ++# through connection A, we didn't isolate per-connection state. + + source ./functions.sh + set -e + set -x + +-requires qemu-io --version ++requires nbdsh --version + + sock=`mktemp -u` +-files="truncate4.out truncate4.pid $sock truncate4.data" ++data=truncate4.data ++files="truncate4.pid $sock $data" + rm -f $files + cleanup_fn rm -f $files + +-# Initial file contents: 1k of pattern 1 +-truncate -s 1024 truncate4.data +-qemu-io -c 'w -P 1 0 1024' -f raw truncate4.data ++# Create and truncate the file. ++: > $data + + # Run nbdkit with file plugin and truncate filter in front. + start_nbdkit -P truncate4.pid -U $sock \ + --filter=truncate \ +- file truncate4.data \ ++ file $data \ + round-up=1024 + +-fail=0 +-exec 4>&1 # Save original stdout +-{ +- exec 5>&1 >&4 # Save connection A, set stdout back to original +- echo 'Reading from connection A, try 1' +- echo 'r -P 1 0 1024' >&5 +- sleep 1 +- echo 'Resizing down' +- truncate -s 512 truncate4.data +- echo 'Reading from connection B' +- echo 'r -P 1 0 512' | qemu-io -f raw nbd:unix:$sock >> truncate4.out +- echo 'Restoring size' +- truncate -s 1024 truncate4.data +- qemu-io -c 'w -P 2 0 1024' -f raw truncate4.data +- echo 'Reading from connection A, try 2' +- echo 'r -P 2 512 512' >&5 +- echo 'quit' >&5 +-} | qemu-io -f raw nbd:unix:$sock >> truncate4.out || fail=1 +-exec 4>&- +- +-cat truncate4.out +-grep 'Pattern verification failed' truncate4.out && fail=1 +-exit $fail ++export data sock ++nbdsh -c ' ++import os ++ ++data = os.environ["data"] ++sock = os.environ["sock"] ++ ++def restore_file(): ++ # Original test data, 1024 bytes of "TEST" repeated. ++ with open (data, "w") as file: ++ file.write ("TEST"*256) ++ ++restore_file () ++ ++print ("Connection A.", flush=True) ++connA = nbd.NBD () ++connA.set_handle_name ("A") ++connA.connect_unix (sock) ++print ("Check the size.", flush=True) ++assert connA.get_size () == 1024 ++ ++print ("Truncate %s to 512 bytes." % data, flush=True) ++os.truncate (data, 512) ++ ++print ("Connection B.", flush=True) ++connB = nbd.NBD () ++connB.set_handle_name ("B") ++connB.connect_unix (sock) ++print ("Check the size.", flush=True) ++assert connB.get_size () == 1024 # because of the round-up parameter ++print ("Read data from connection B.", flush=True) ++buf = connB.pread (1024, 0) ++assert buf == b"TEST"*128 + b"\0"*512 ++ ++print ("Restore the file size and original data.", flush=True) ++restore_file () ++ ++print ("Read data from connection A.", flush=True) ++buf = connA.pread (1024, 0) ++assert 1024 == len (buf) ++assert buf == b"TEST"*256 ++' +-- +2.25.0 + diff --git a/nbdkit.spec b/nbdkit.spec index 12beddc..8b6397b 100644 --- a/nbdkit.spec +++ b/nbdkit.spec @@ -45,7 +45,7 @@ ExclusiveArch: x86_64 Name: nbdkit Version: 1.21.4 -Release: 1%{?dist} +Release: 2%{?dist} Summary: NBD server License: BSD @@ -58,6 +58,9 @@ Source1: http://libguestfs.org/download/nbdkit/%{source_directory}/%{name Source2: libguestfs.keyring %endif +# Upstream patch to make tests/test-truncate4.sh more stable on s390x. +Patch1: 0001-tests-test-truncate4.sh-Rewrite-to-use-nbdsh.patch + %if 0%{patches_touch_autotools} BuildRequires: autoconf, automake, libtool %endif @@ -981,6 +984,9 @@ make %{?_smp_mflags} check || { %changelog +* Wed May 20 2020 Richard W.M. Jones - 1.21.4-2 +- Add upstream patch to make tests/test-truncate4.sh more stable on s390x. + * Tue May 19 2020 Richard W.M. Jones - 1.21.4-1 - New upstream development version 1.21.4.