diff options
Diffstat (limited to 'tests')
-rwxr-xr-x | tests/qemu-iotests/147 | 4 | ||||
-rwxr-xr-x | tests/qemu-iotests/233 | 1 | ||||
-rw-r--r-- | tests/qemu-iotests/common.nbd | 94 | ||||
-rw-r--r-- | tests/qemu-iotests/common.rc | 6 | ||||
-rw-r--r-- | tests/qemu-iotests/iotests.py | 9 |
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''' |