iotests/308: Add multi-threading sanity test

Run qemu-img bench on a simple multi-threaded FUSE export to test that
it works.

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Hanna Czenczek <hreitz@redhat.com>
Message-ID: <20260309150856.26800-26-hreitz@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Hanna Czenczek
2026-03-09 16:08:56 +01:00
committed by Kevin Wolf
parent 40ee2ff0ce
commit 2224bff1ba
2 changed files with 107 additions and 0 deletions

View File

@@ -441,6 +441,57 @@ $QEMU_IO -c 'read -P 0 0 64M' "$TEST_IMG" | _filter_qemu_io
_cleanup_test_img
echo
echo '=== Multi-threading ==='
# Just set up a null block device, export it (with multi-threading), and run
# qemu-img bench on it (to get parallel requests)
_launch_qemu
_send_qemu_cmd $QEMU_HANDLE \
"{'execute': 'qmp_capabilities'}" \
'return'
_send_qemu_cmd $QEMU_HANDLE \
"{'execute': 'blockdev-add',
'arguments': {
'driver': 'null-co',
'node-name': 'null'
} }" \
'return'
for id in iothread{0,1,2,3}; do
_send_qemu_cmd $QEMU_HANDLE \
"{'execute': 'object-add',
'arguments': {
'qom-type': 'iothread',
'id': '$id'
} }" \
'return'
done
echo
iothreads="['iothread0', 'iothread1', 'iothread2', 'iothread3']"
fuse_export_add \
'export' \
"'mountpoint': '$EXT_MP', 'iothread': $iothreads" \
'return' \
'null'
echo
$QEMU_IMG bench -f raw "$EXT_MP" |
sed -e 's/[0-9.]\+ seconds/X.XXX seconds/'
echo
fuse_export_del 'export'
_send_qemu_cmd $QEMU_HANDLE \
"{'execute': 'quit'}" \
'return'
wait=yes _cleanup_qemu
# success, all done
echo "*** done"
rm -f $seq.full

View File

@@ -217,4 +217,60 @@ read 67108864/67108864 bytes at offset 0
{"return": {}}
read 67108864/67108864 bytes at offset 0
64 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
=== Multi-threading ===
{'execute': 'qmp_capabilities'}
{"return": {}}
{'execute': 'blockdev-add',
'arguments': {
'driver': 'null-co',
'node-name': 'null'
} }
{"return": {}}
{'execute': 'object-add',
'arguments': {
'qom-type': 'iothread',
'id': 'iothread0'
} }
{"return": {}}
{'execute': 'object-add',
'arguments': {
'qom-type': 'iothread',
'id': 'iothread1'
} }
{"return": {}}
{'execute': 'object-add',
'arguments': {
'qom-type': 'iothread',
'id': 'iothread2'
} }
{"return": {}}
{'execute': 'object-add',
'arguments': {
'qom-type': 'iothread',
'id': 'iothread3'
} }
{"return": {}}
{'execute': 'block-export-add',
'arguments': {
'type': 'fuse',
'id': 'export',
'node-name': 'null',
'mountpoint': 'TEST_DIR/t.IMGFMT.fuse', 'iothread': ['iothread0', 'iothread1', 'iothread2', 'iothread3']
} }
{"return": {}}
Sending 75000 read requests, 4096 bytes each, 64 in parallel (starting at offset 0, step size 4096)
Run completed in X.XXX seconds.
{'execute': 'block-export-del',
'arguments': {
'id': 'export'
} }
{"return": {}}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export"}}
{'execute': 'quit'}
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
{"return": {}}
*** done