qemu/tests/qemu-iotests/144
Kevin Wolf cc29c12ec6 iotests: Make 144 deterministic again
Since commit effd60c8 changed how QMP commands are processed, the order
of the block-commit return value and job events in iotests 144 wasn't
fixed and more and caused the test to fail intermittently.

Change the test to cache events first and then print them in a
predefined order.

Waiting three times for JOB_STATUS_CHANGE is a bit uglier than just
waiting for the JOB_STATUS_CHANGE that has "status": "ready", but the
tooling we have doesn't seem to allow the latter easily.

Fixes: effd60c878
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2126
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-id: 20240209173103.239994-1-kwolf@redhat.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
2024-02-15 16:40:06 +00:00

126 lines
3.4 KiB
Bash
Executable File

#!/usr/bin/env bash
# group: rw quick
# Check live snapshot, followed by active commit, and another snapshot.
#
# This test is to catch the error case of BZ #1300209:
# https://bugzilla.redhat.com/show_bug.cgi?id=1300209
#
# Copyright (C) 2016 Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# creator
owner=codyprime@gmail.com
seq=`basename $0`
echo "QA output created by $seq"
status=1 # failure is the default!
TMP_SNAP1=${TEST_DIR}/tmp.qcow2
TMP_SNAP2=${TEST_DIR}/tmp2.qcow2
_cleanup()
{
_cleanup_qemu
for img in "${TEST_IMG}" "${TMP_SNAP1}" "${TMP_SNAP2}"; do
_rm_test_img "$img"
done
}
trap "_cleanup; exit \$status" 0 1 2 3 15
# get standard environment, filters and checks
. ./common.rc
. ./common.filter
. ./common.qemu
_supported_fmt qcow2
_supported_proto file
size=512M
_make_test_img $size
echo
echo === Launching QEMU ===
echo
qemu_comm_method="qmp"
_launch_qemu -drive file="${TEST_IMG}",if=virtio
h=$QEMU_HANDLE
echo
echo === Performing Live Snapshot 1 ===
echo
_send_qemu_cmd $h "{ 'execute': 'qmp_capabilities' }" "return"
# First live snapshot, new overlay as active layer
_send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot-sync',
'arguments': {
'device': 'virtio0',
'snapshot-file':'${TMP_SNAP1}',
'format': 'qcow2'
}
}" "return"
echo
echo === Performing block-commit on active layer ===
echo
capture_events="BLOCK_JOB_READY JOB_STATUS_CHANGE"
# Block commit on active layer, push the new overlay into base
_send_qemu_cmd $h "{ 'execute': 'block-commit',
'arguments': {
'device': 'virtio0'
}
}" "return"
_wait_event $h "JOB_STATUS_CHANGE"
_wait_event $h "JOB_STATUS_CHANGE"
_wait_event $h "JOB_STATUS_CHANGE"
_wait_event $h "BLOCK_JOB_READY"
capture_events=
_send_qemu_cmd $h "{ 'execute': 'block-job-complete',
'arguments': {
'device': 'virtio0'
}
}" '"status": "null"'
echo
echo === Performing Live Snapshot 2 ===
echo
# New live snapshot, new overlays as active layer
_send_qemu_cmd $h "{ 'execute': 'blockdev-snapshot-sync',
'arguments': {
'device': 'virtio0',
'snapshot-file':'${TMP_SNAP2}',
'format': 'qcow2'
}
}" "return"
# success, all done
echo "*** done"
rm -f $seq.full
status=0