qemu-iotests: test NBD over UNIX domain sockets in 083

083 only tests TCP.  Some failures might be specific to UNIX domain
sockets.

A few adjustments are necessary:

1. Generating a port number and waiting for server startup is
   TCP-specific.  Use the new nbd-fault-injector.py startup protocol to
   fetch the address.  This is a little more elegant because we don't
   need netstat anymore.

2. The NBD filter does not work for the UNIX domain sockets URIs we
   generate and must be extended.

3. Run all tests twice: once for TCP and once for UNIX domain sockets.

Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-Id: <20170829122745.14309-4-stefanha@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Stefan Hajnoczi 2017-08-29 13:27:45 +01:00 committed by Eric Blake
parent 6e592fc922
commit 02d2d860d2
3 changed files with 215 additions and 72 deletions

View File

@ -27,6 +27,14 @@ echo "QA output created by $seq"
here=`pwd` here=`pwd`
status=1 # failure is the default! status=1 # failure is the default!
_cleanup()
{
rm -f nbd.sock
rm -f nbd-fault-injector.out
rm -f nbd-fault-injector.conf
}
trap "_cleanup; exit \$status" 0 1 2 3 15
# get standard environment, filters and checks # get standard environment, filters and checks
. ./common.rc . ./common.rc
. ./common.filter . ./common.filter
@ -35,81 +43,105 @@ _supported_fmt generic
_supported_proto nbd _supported_proto nbd
_supported_os Linux _supported_os Linux
# Pick a TCP port based on our pid. This way multiple instances of this test
# can run in parallel without conflicting.
choose_tcp_port() {
echo $((($$ % 31744) + 1024)) # 1024 <= port < 32768
}
wait_for_tcp_port() {
while ! (netstat --tcp --listening --numeric | \
grep "$1.*0\\.0\\.0\\.0:\\*.*LISTEN") >/dev/null 2>&1; do
sleep 0.1
done
}
check_disconnect() { check_disconnect() {
local event export_name=foo extra_args nbd_addr nbd_url proto when
while true; do
case $1 in
--classic-negotiation)
shift
extra_args=--classic-negotiation
export_name=
;;
--tcp)
shift
proto=tcp
;;
--unix)
shift
proto=unix
;;
*)
break
;;
esac
done
event=$1 event=$1
when=$2 when=$2
negotiation=$3
echo "=== Check disconnect $when $event ===" echo "=== Check disconnect $when $event ==="
echo echo
port=$(choose_tcp_port)
cat > "$TEST_DIR/nbd-fault-injector.conf" <<EOF cat > "$TEST_DIR/nbd-fault-injector.conf" <<EOF
[inject-error] [inject-error]
event=$event event=$event
when=$when when=$when
EOF EOF
if [ "$negotiation" = "--classic-negotiation" ]; then if [ "$proto" = "tcp" ]; then
extra_args=--classic-negotiation nbd_addr="127.0.0.1:0"
nbd_url="nbd:127.0.0.1:$port"
else else
nbd_url="nbd:127.0.0.1:$port:exportname=foo" nbd_addr="$TEST_DIR/nbd.sock"
fi
rm -f "$TEST_DIR/nbd.sock"
$PYTHON nbd-fault-injector.py $extra_args "$nbd_addr" "$TEST_DIR/nbd-fault-injector.conf" >"$TEST_DIR/nbd-fault-injector.out" 2>&1 &
# Wait for server to be ready
while ! grep -q 'Listening on ' "$TEST_DIR/nbd-fault-injector.out"; do
sleep 0.1
done
# Extract the final address (port number has now been assigned in tcp case)
nbd_addr=$(sed 's/Listening on \(.*\)$/\1/' "$TEST_DIR/nbd-fault-injector.out")
if [ "$proto" = "tcp" ]; then
nbd_url="nbd+tcp://$nbd_addr/$export_name"
else
nbd_url="nbd+unix:///$export_name?socket=$nbd_addr"
fi fi
$PYTHON nbd-fault-injector.py $extra_args "127.0.0.1:$port" "$TEST_DIR/nbd-fault-injector.conf" >/dev/null 2>&1 &
wait_for_tcp_port "127\\.0\\.0\\.1:$port"
$QEMU_IO -c "read 0 512" "$nbd_url" 2>&1 | _filter_qemu_io | _filter_nbd $QEMU_IO -c "read 0 512" "$nbd_url" 2>&1 | _filter_qemu_io | _filter_nbd
echo echo
} }
for event in neg1 "export" neg2 request reply data; do for proto in tcp unix; do
for when in before after; do for event in neg1 "export" neg2 request reply data; do
check_disconnect "$event" "$when" for when in before after; do
check_disconnect "--$proto" "$event" "$when"
done
# Also inject short replies from the NBD server
case "$event" in
neg1)
for when in 8 16; do
check_disconnect "--$proto" "$event" "$when"
done
;;
"export")
for when in 4 12 16; do
check_disconnect "--$proto" "$event" "$when"
done
;;
neg2)
for when in 8 10; do
check_disconnect "--$proto" "$event" "$when"
done
;;
reply)
for when in 4 8; do
check_disconnect "--$proto" "$event" "$when"
done
;;
esac
done done
# Also inject short replies from the NBD server # Also check classic negotiation without export information
case "$event" in for when in before 8 16 24 28 after; do
neg1) check_disconnect "--$proto" --classic-negotiation "neg-classic" "$when"
for when in 8 16; do done
check_disconnect "$event" "$when"
done
;;
"export")
for when in 4 12 16; do
check_disconnect "$event" "$when"
done
;;
neg2)
for when in 8 10; do
check_disconnect "$event" "$when"
done
;;
reply)
for when in 4 8; do
check_disconnect "$event" "$when"
done
;;
esac
done
# Also check classic negotiation without export information
for when in before 8 16 24 28 after; do
check_disconnect "neg-classic" "$when" --classic-negotiation
done done
# success, all done # success, all done

View File

@ -1,43 +1,43 @@
QA output created by 083 QA output created by 083
=== Check disconnect before neg1 === === Check disconnect before neg1 ===
can't open device nbd:127.0.0.1:PORT:exportname=foo can't open device nbd+tcp://127.0.0.1:PORT/foo
=== Check disconnect after neg1 === === Check disconnect after neg1 ===
can't open device nbd:127.0.0.1:PORT:exportname=foo can't open device nbd+tcp://127.0.0.1:PORT/foo
=== Check disconnect 8 neg1 === === Check disconnect 8 neg1 ===
can't open device nbd:127.0.0.1:PORT:exportname=foo can't open device nbd+tcp://127.0.0.1:PORT/foo
=== Check disconnect 16 neg1 === === Check disconnect 16 neg1 ===
can't open device nbd:127.0.0.1:PORT:exportname=foo can't open device nbd+tcp://127.0.0.1:PORT/foo
=== Check disconnect before export === === Check disconnect before export ===
can't open device nbd:127.0.0.1:PORT:exportname=foo can't open device nbd+tcp://127.0.0.1:PORT/foo
=== Check disconnect after export === === Check disconnect after export ===
can't open device nbd:127.0.0.1:PORT:exportname=foo can't open device nbd+tcp://127.0.0.1:PORT/foo
=== Check disconnect 4 export === === Check disconnect 4 export ===
can't open device nbd:127.0.0.1:PORT:exportname=foo can't open device nbd+tcp://127.0.0.1:PORT/foo
=== Check disconnect 12 export === === Check disconnect 12 export ===
can't open device nbd:127.0.0.1:PORT:exportname=foo can't open device nbd+tcp://127.0.0.1:PORT/foo
=== Check disconnect 16 export === === Check disconnect 16 export ===
can't open device nbd:127.0.0.1:PORT:exportname=foo can't open device nbd+tcp://127.0.0.1:PORT/foo
=== Check disconnect before neg2 === === Check disconnect before neg2 ===
can't open device nbd:127.0.0.1:PORT:exportname=foo can't open device nbd+tcp://127.0.0.1:PORT/foo
=== Check disconnect after neg2 === === Check disconnect after neg2 ===
@ -45,11 +45,11 @@ read failed: Input/output error
=== Check disconnect 8 neg2 === === Check disconnect 8 neg2 ===
can't open device nbd:127.0.0.1:PORT:exportname=foo can't open device nbd+tcp://127.0.0.1:PORT/foo
=== Check disconnect 10 neg2 === === Check disconnect 10 neg2 ===
can't open device nbd:127.0.0.1:PORT:exportname=foo can't open device nbd+tcp://127.0.0.1:PORT/foo
=== Check disconnect before request === === Check disconnect before request ===
@ -88,23 +88,134 @@ read 512/512 bytes at offset 0
=== Check disconnect before neg-classic === === Check disconnect before neg-classic ===
can't open device nbd:127.0.0.1:PORT can't open device nbd+tcp://127.0.0.1:PORT/
=== Check disconnect 8 neg-classic === === Check disconnect 8 neg-classic ===
can't open device nbd:127.0.0.1:PORT can't open device nbd+tcp://127.0.0.1:PORT/
=== Check disconnect 16 neg-classic === === Check disconnect 16 neg-classic ===
can't open device nbd:127.0.0.1:PORT can't open device nbd+tcp://127.0.0.1:PORT/
=== Check disconnect 24 neg-classic === === Check disconnect 24 neg-classic ===
can't open device nbd:127.0.0.1:PORT can't open device nbd+tcp://127.0.0.1:PORT/
=== Check disconnect 28 neg-classic === === Check disconnect 28 neg-classic ===
can't open device nbd:127.0.0.1:PORT can't open device nbd+tcp://127.0.0.1:PORT/
=== Check disconnect after neg-classic ===
read failed: Input/output error
=== Check disconnect before neg1 ===
can't open device nbd+unix:///foo?socket=TEST_DIR/nbd.sock
=== Check disconnect after neg1 ===
can't open device nbd+unix:///foo?socket=TEST_DIR/nbd.sock
=== Check disconnect 8 neg1 ===
can't open device nbd+unix:///foo?socket=TEST_DIR/nbd.sock
=== Check disconnect 16 neg1 ===
can't open device nbd+unix:///foo?socket=TEST_DIR/nbd.sock
=== Check disconnect before export ===
can't open device nbd+unix:///foo?socket=TEST_DIR/nbd.sock
=== Check disconnect after export ===
can't open device nbd+unix:///foo?socket=TEST_DIR/nbd.sock
=== Check disconnect 4 export ===
can't open device nbd+unix:///foo?socket=TEST_DIR/nbd.sock
=== Check disconnect 12 export ===
can't open device nbd+unix:///foo?socket=TEST_DIR/nbd.sock
=== Check disconnect 16 export ===
can't open device nbd+unix:///foo?socket=TEST_DIR/nbd.sock
=== Check disconnect before neg2 ===
can't open device nbd+unix:///foo?socket=TEST_DIR/nbd.sock
=== Check disconnect after neg2 ===
read failed: Input/output error
=== Check disconnect 8 neg2 ===
can't open device nbd+unix:///foo?socket=TEST_DIR/nbd.sock
=== Check disconnect 10 neg2 ===
can't open device nbd+unix:///foo?socket=TEST_DIR/nbd.sock
=== Check disconnect before request ===
read failed: Input/output error
=== Check disconnect after request ===
read failed: Input/output error
=== Check disconnect before reply ===
read failed: Input/output error
=== Check disconnect after reply ===
read failed: Input/output error
=== Check disconnect 4 reply ===
read failed
read failed: Input/output error
=== Check disconnect 8 reply ===
read failed
read failed: Input/output error
=== Check disconnect before data ===
read failed: Input/output error
=== Check disconnect after data ===
read 512/512 bytes at offset 0
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
=== Check disconnect before neg-classic ===
can't open device nbd+unix:///?socket=TEST_DIR/nbd.sock
=== Check disconnect 8 neg-classic ===
can't open device nbd+unix:///?socket=TEST_DIR/nbd.sock
=== Check disconnect 16 neg-classic ===
can't open device nbd+unix:///?socket=TEST_DIR/nbd.sock
=== Check disconnect 24 neg-classic ===
can't open device nbd+unix:///?socket=TEST_DIR/nbd.sock
=== Check disconnect 28 neg-classic ===
can't open device nbd+unix:///?socket=TEST_DIR/nbd.sock
=== Check disconnect after neg-classic === === Check disconnect after neg-classic ===

View File

@ -170,9 +170,9 @@ _filter_nbd()
# #
# Filter out the TCP port number since this changes between runs. # Filter out the TCP port number since this changes between runs.
sed -e '/nbd\/.*\.c:/d' \ sed -e '/nbd\/.*\.c:/d' \
-e 's#nbd:\(//\)\?127\.0\.0\.1:[0-9]*#nbd:\1127.0.0.1:PORT#g' \ -e 's#127\.0\.0\.1:[0-9]*#127.0.0.1:PORT#g' \
-e "s#?socket=$TEST_DIR#?socket=TEST_DIR#g" \ -e "s#?socket=$TEST_DIR#?socket=TEST_DIR#g" \
-e 's#\(exportname=foo\|PORT\): Failed to .*$#\1#' -e 's#\(foo\|PORT/\?\|.sock\): Failed to .*$#\1#'
} }
# make sure this script returns success # make sure this script returns success