mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 17:53:56 -06:00
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:
parent
6e592fc922
commit
02d2d860d2
3 changed files with 215 additions and 72 deletions
|
@ -27,6 +27,14 @@ echo "QA output created by $seq"
|
|||
here=`pwd`
|
||||
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
|
||||
. ./common.rc
|
||||
. ./common.filter
|
||||
|
@ -35,81 +43,105 @@ _supported_fmt generic
|
|||
_supported_proto nbd
|
||||
_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() {
|
||||
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
|
||||
when=$2
|
||||
negotiation=$3
|
||||
echo "=== Check disconnect $when $event ==="
|
||||
echo
|
||||
|
||||
port=$(choose_tcp_port)
|
||||
|
||||
cat > "$TEST_DIR/nbd-fault-injector.conf" <<EOF
|
||||
[inject-error]
|
||||
event=$event
|
||||
when=$when
|
||||
EOF
|
||||
|
||||
if [ "$negotiation" = "--classic-negotiation" ]; then
|
||||
extra_args=--classic-negotiation
|
||||
nbd_url="nbd:127.0.0.1:$port"
|
||||
if [ "$proto" = "tcp" ]; then
|
||||
nbd_addr="127.0.0.1:0"
|
||||
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
|
||||
|
||||
$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
|
||||
|
||||
echo
|
||||
}
|
||||
|
||||
for event in neg1 "export" neg2 request reply data; do
|
||||
for when in before after; do
|
||||
check_disconnect "$event" "$when"
|
||||
for proto in tcp unix; do
|
||||
for event in neg1 "export" neg2 request reply data; do
|
||||
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
|
||||
|
||||
# Also inject short replies from the NBD server
|
||||
case "$event" in
|
||||
neg1)
|
||||
for when in 8 16; do
|
||||
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
|
||||
# Also check classic negotiation without export information
|
||||
for when in before 8 16 24 28 after; do
|
||||
check_disconnect "--$proto" --classic-negotiation "neg-classic" "$when"
|
||||
done
|
||||
done
|
||||
|
||||
# success, all done
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue