From: Eric Blake <eblake@redhat.com>
To: qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
"open list:Block layer core" <qemu-block@nongnu.org>,
Max Reitz <mreitz@redhat.com>
Subject: [Qemu-devel] [PULL 5/9] iotests: Let 233 run concurrently
Date: Thu, 13 Jun 2019 10:48:33 -0500 [thread overview]
Message-ID: <20190613154837.21734-6-eblake@redhat.com> (raw)
In-Reply-To: <20190613154837.21734-1-eblake@redhat.com>
From: Max Reitz <mreitz@redhat.com>
common.nbd's nbd_server_set_tcp_port() tries to find a free port, and
then uses it for the whole test run. However, this is racy because even
if the port was free at the beginning, there is no guarantee it will
continue to be available. Therefore, 233 currently cannot reliably be
run concurrently with other NBD TCP tests.
This patch addresses the problem by dropping nbd_server_set_tcp_port(),
and instead finding a new port every time nbd_server_start_tcp_socket()
is invoked. For this, we run qemu-nbd with --fork and on error evaluate
the output to see whether it contains "Address already in use". If so,
we try the next port.
On success, we still want to continually redirect the output from
qemu-nbd to stderr. To achieve both, we redirect qemu-nbd's stderr to a
FIFO that we then open in bash. If the parent process exits with status
0 (which means that the server has started successfully), we launch a
background cat process that copies the FIFO to stderr. On failure, we
read the whole content into a variable and then evaluate it.
While at it, use --fork in nbd_server_start_unix_socket(), too. Doing
so allows us to drop nbd_server_wait_for_*_socket().
Note that the reason common.nbd did not use --fork before is that
qemu-nbd did not have --pid-file.
Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <20190508211820.17851-6-mreitz@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
---
tests/qemu-iotests/common.nbd | 100 +++++++++++++++-------------------
tests/qemu-iotests/233 | 1 -
2 files changed, 45 insertions(+), 56 deletions(-)
diff --git a/tests/qemu-iotests/common.nbd b/tests/qemu-iotests/common.nbd
index 25fc9ffaa46b..24b01b60aae1 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
+
+ # Failure, read the output
+ output=$(cat <&$nbd_fifo_fd)
+ eval "exec $nbd_fifo_fd>&-"
+
+ if ! echo "$output" | grep -q "Address already in use"
+ then
+ # Unknown error, print it
+ echo "$output" >&2
+ rm -f "$nbd_stderr_fifo"
+ exit 1
+ fi
done
echo "Cannot find free TCP port for nbd in range 10809-10909"
+ rm -f "$nbd_stderr_fifo"
exit 1
}
-
-nbd_server_wait_for_tcp_socket()
-{
- pid=$1
-
- 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
- then
- echo "qemu-nbd unexpectedly quit"
- 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 $!
-}
diff --git a/tests/qemu-iotests/233 b/tests/qemu-iotests/233
index 057cad204460..a5c17c39639d 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
--
2.20.1
next prev parent reply other threads:[~2019-06-13 17:42 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-13 15:48 [Qemu-devel] [PULL 0/9] NBD patches through 2019-06-13 Eric Blake
2019-06-13 15:48 ` [Qemu-devel] [PULL 1/9] qemu-nbd: Add --pid-file option Eric Blake
2019-06-13 15:48 ` [Qemu-devel] [PULL 2/9] iotests.py: Add qemu_nbd_early_pipe() Eric Blake
2019-06-13 15:48 ` [Qemu-devel] [PULL 3/9] qemu-nbd: Do not close stderr Eric Blake
2019-06-13 15:48 ` [Qemu-devel] [PULL 4/9] iotests: Use qemu-nbd's --pid-file Eric Blake
2019-06-13 15:48 ` Eric Blake [this message]
2019-06-13 15:48 ` [Qemu-devel] [PULL 6/9] nbd/server: Nicer spelling of max BLOCK_STATUS reply length Eric Blake
2019-06-13 15:48 ` [Qemu-devel] [PULL 7/9] block/nbd-client: drop stale logout Eric Blake
2019-06-13 15:48 ` [Qemu-devel] [PULL 8/9] block/nbd: merge nbd-client.* to nbd.c Eric Blake
2019-06-13 15:48 ` [Qemu-devel] [PULL 9/9] block/nbd: merge NBDClientSession struct back to BDRVNBDState Eric Blake
2019-06-13 17:56 ` [Qemu-devel] [PULL 0/9] NBD patches through 2019-06-13 Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190613154837.21734-6-eblake@redhat.com \
--to=eblake@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).