summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorPeter Maydell2019-06-13 19:17:32 +0200
committerPeter Maydell2019-06-13 19:17:32 +0200
commitd1bf88e56f46c75d472dc60c02bbbc7b474519f9 (patch)
treef773f3c6540d6e9ad94ee83b0a8b45843f77fe42 /tests
parentMerge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20190613-... (diff)
parentblock/nbd: merge NBDClientSession struct back to BDRVNBDState (diff)
downloadqemu-d1bf88e56f46c75d472dc60c02bbbc7b474519f9.tar.gz
qemu-d1bf88e56f46c75d472dc60c02bbbc7b474519f9.tar.xz
qemu-d1bf88e56f46c75d472dc60c02bbbc7b474519f9.zip
Merge remote-tracking branch 'remotes/ericb/tags/pull-nbd-2019-06-13' into staging
nbd patches for 2019-06-13 - add 'qemu-nbd --pid-file' - NBD-related iotest improvements - NBD code refactoring in preparation for reconnect # gpg: Signature made Thu 13 Jun 2019 16:37:58 BST # gpg: using RSA key A7A16B4A2527436A # gpg: Good signature from "Eric Blake <eblake@redhat.com>" [full] # gpg: aka "Eric Blake (Free Software Programmer) <ebb9@byu.net>" [full] # gpg: aka "[jpeg image of size 6874]" [full] # Primary key fingerprint: 71C2 CC22 B1C4 6029 27D2 F3AA A7A1 6B4A 2527 436A * remotes/ericb/tags/pull-nbd-2019-06-13: block/nbd: merge NBDClientSession struct back to BDRVNBDState block/nbd: merge nbd-client.* to nbd.c block/nbd-client: drop stale logout nbd/server: Nicer spelling of max BLOCK_STATUS reply length iotests: Let 233 run concurrently iotests: Use qemu-nbd's --pid-file qemu-nbd: Do not close stderr iotests.py: Add qemu_nbd_early_pipe() qemu-nbd: Add --pid-file option Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'tests')
-rwxr-xr-xtests/qemu-iotests/1474
-rwxr-xr-xtests/qemu-iotests/2331
-rw-r--r--tests/qemu-iotests/common.nbd94
-rw-r--r--tests/qemu-iotests/common.rc6
-rw-r--r--tests/qemu-iotests/iotests.py9
5 files changed, 52 insertions, 62 deletions
diff --git a/tests/qemu-iotests/147 b/tests/qemu-iotests/147
index 82513279b0..2d84fddb01 100755
--- a/tests/qemu-iotests/147
+++ b/tests/qemu-iotests/147
@@ -24,7 +24,7 @@ import socket
import stat
import time
import iotests
-from iotests import cachemode, imgfmt, qemu_img, qemu_nbd, qemu_nbd_pipe
+from iotests import cachemode, imgfmt, qemu_img, qemu_nbd, qemu_nbd_early_pipe
NBD_PORT_START = 32768
NBD_PORT_END = NBD_PORT_START + 1024
@@ -93,7 +93,7 @@ class QemuNBD(NBDBlockdevAddBase):
pass
def _try_server_up(self, *args):
- status, msg = qemu_nbd_pipe('-f', imgfmt, test_img, *args)
+ status, msg = qemu_nbd_early_pipe('-f', imgfmt, test_img, *args)
if status == 0:
return True
if 'Address already in use' in msg:
diff --git a/tests/qemu-iotests/233 b/tests/qemu-iotests/233
index 057cad2044..a5c17c3963 100755
--- a/tests/qemu-iotests/233
+++ b/tests/qemu-iotests/233
@@ -49,7 +49,6 @@ _supported_proto file
# If porting to non-Linux, consider using socat instead of ss in common.nbd
_require_command QEMU_NBD
-nbd_server_set_tcp_port
tls_x509_init
echo
diff --git a/tests/qemu-iotests/common.nbd b/tests/qemu-iotests/common.nbd
index 25fc9ffaa4..24b01b60aa 100644
--- a/tests/qemu-iotests/common.nbd
+++ b/tests/qemu-iotests/common.nbd
@@ -22,6 +22,11 @@
nbd_unix_socket="${TEST_DIR}/qemu-nbd.sock"
nbd_tcp_addr="127.0.0.1"
nbd_pid_file="${TEST_DIR}/qemu-nbd.pid"
+nbd_stderr_fifo="${TEST_DIR}/qemu-nbd.fifo"
+
+# If bash version is >= 4.1, this will be overwritten by a dynamically
+# assigned file descriptor value.
+nbd_fifo_fd=10
nbd_server_stop()
{
@@ -33,77 +38,62 @@ nbd_server_stop()
kill "$NBD_PID"
fi
fi
- rm -f "$nbd_unix_socket"
-}
-
-nbd_server_wait_for_unix_socket()
-{
- pid=$1
-
- for ((i = 0; i < 300; i++))
- do
- if [ -r "$nbd_unix_socket" ]; then
- return
- fi
- kill -s 0 $pid 2>/dev/null
- if test $? != 0
- then
- echo "qemu-nbd unexpectedly quit"
- exit 1
- fi
- sleep 0.1
- done
- echo "Failed in check of unix socket created by qemu-nbd"
- exit 1
+ rm -f "$nbd_unix_socket" "$nbd_stderr_fifo"
}
nbd_server_start_unix_socket()
{
nbd_server_stop
- $QEMU_NBD -v -t -k "$nbd_unix_socket" "$@" &
- nbd_server_wait_for_unix_socket $!
+ $QEMU_NBD -v -t -k "$nbd_unix_socket" --fork "$@"
}
-nbd_server_set_tcp_port()
+nbd_server_start_tcp_socket()
{
- (ss --help) >/dev/null 2>&1 || _notrun "ss utility not found, skipping test"
+ nbd_server_stop
+ mkfifo "$nbd_stderr_fifo"
for ((port = 10809; port <= 10909; port++))
do
- if ! ss -tln | grep -sqE ":$port\b"; then
+ # Redirect stderr to FIFO, so we can later decide whether we
+ # want to read it or to redirect it to our stderr, depending
+ # on whether the command fails or not
+ $QEMU_NBD -v -t -b $nbd_tcp_addr -p $port --fork "$@" \
+ 2> "$nbd_stderr_fifo" &
+
+ # Taken from common.qemu
+ if [[ "${BASH_VERSINFO[0]}" -ge "5" ||
+ ("${BASH_VERSINFO[0]}" -ge "4" && "${BASH_VERSINFO[1]}" -ge "1") ]]
+ then
+ exec {nbd_fifo_fd}<"$nbd_stderr_fifo"
+ else
+ let _nbd_fifo_fd++
+ eval "exec ${_nbd_fifo_fd}<'$nbd_stderr_fifo'"
+ fi
+ wait $!
+
+ if test $? == 0
+ then
+ # Success, redirect qemu-nbd's stderr to our stderr
nbd_tcp_port=$port
+ (cat <&$nbd_fifo_fd >&2) &
+ eval "exec $nbd_fifo_fd>&-"
return
fi
- done
- echo "Cannot find free TCP port for nbd in range 10809-10909"
- exit 1
-}
-
-nbd_server_wait_for_tcp_socket()
-{
- pid=$1
+ # Failure, read the output
+ output=$(cat <&$nbd_fifo_fd)
+ eval "exec $nbd_fifo_fd>&-"
- for ((i = 0; i < 300; i++))
- do
- if ss -tln | grep -sqE ":$nbd_tcp_port\b"; then
- return
- fi
- kill -s 0 $pid 2>/dev/null
- if test $? != 0
+ if ! echo "$output" | grep -q "Address already in use"
then
- echo "qemu-nbd unexpectedly quit"
+ # Unknown error, print it
+ echo "$output" >&2
+ rm -f "$nbd_stderr_fifo"
exit 1
fi
- sleep 0.1
done
- echo "Failed in check of TCP socket created by qemu-nbd"
- exit 1
-}
-nbd_server_start_tcp_socket()
-{
- nbd_server_stop
- $QEMU_NBD -v -t -b $nbd_tcp_addr -p $nbd_tcp_port "$@" &
- nbd_server_wait_for_tcp_socket $!
+ echo "Cannot find free TCP port for nbd in range 10809-10909"
+ rm -f "$nbd_stderr_fifo"
+ exit 1
}
diff --git a/tests/qemu-iotests/common.rc b/tests/qemu-iotests/common.rc
index 93f87389b6..5502c3da2f 100644
--- a/tests/qemu-iotests/common.rc
+++ b/tests/qemu-iotests/common.rc
@@ -105,10 +105,8 @@ _qemu_io_wrapper()
_qemu_nbd_wrapper()
{
- (
- echo $BASHPID > "${QEMU_TEST_DIR}/qemu-nbd.pid"
- exec "$QEMU_NBD_PROG" $QEMU_NBD_OPTIONS "$@"
- )
+ "$QEMU_NBD_PROG" --pid-file="${QEMU_TEST_DIR}/qemu-nbd.pid" \
+ $QEMU_NBD_OPTIONS "$@"
}
_qemu_vxhs_wrapper()
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
index 6bcddd8870..f11482f3dc 100644
--- a/tests/qemu-iotests/iotests.py
+++ b/tests/qemu-iotests/iotests.py
@@ -209,9 +209,9 @@ def qemu_nbd(*args):
'''Run qemu-nbd in daemon mode and return the parent's exit code'''
return subprocess.call(qemu_nbd_args + ['--fork'] + list(args))
-def qemu_nbd_pipe(*args):
+def qemu_nbd_early_pipe(*args):
'''Run qemu-nbd in daemon mode and return both the parent's exit code
- and its output'''
+ and its output in case of an error'''
subp = subprocess.Popen(qemu_nbd_args + ['--fork'] + list(args),
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
@@ -221,7 +221,10 @@ def qemu_nbd_pipe(*args):
sys.stderr.write('qemu-nbd received signal %i: %s\n' %
(-exitcode,
' '.join(qemu_nbd_args + ['--fork'] + list(args))))
- return exitcode, subp.communicate()[0]
+ if exitcode == 0:
+ return exitcode, ''
+ else:
+ return exitcode, subp.communicate()[0]
def compare_images(img1, img2, fmt1=imgfmt, fmt2=imgfmt):
'''Return True if two image files are identical'''