aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorAlberto Garcia <berto@igalia.com>2019-01-31 14:38:10 +0200
committerKevin Wolf <kwolf@redhat.com>2019-02-01 13:46:45 +0100
commita5df73baaf27a2aa4a911545ee1ee6286a5372e4 (patch)
treec2fe8a28c865e8556a058b1994b18fb723849b25 /scripts
parent78fc3b3a26c145eebcdee992988644974b243a74 (diff)
qtest.py: Wait for the result of qtest commands
The cmd() method of the QEMUQtestProtocol class sends a qtest command to QEMU but doesn't wait for the return message ("OK", "FAIL", "ERR"). Because of this, it can return control to the caller before the command has actually finished. In cases like clock_step or clock_set this means that cmd() can return before all the timers triggered by the clock change have been fired. This can be fixed by making cmd() wait for the output of the qtest command. This fixes iotests 093 and 136, which are flaky since commit 8258292e18c39480b64eba9f3551 when the machine is under heavy workload. Signed-off-by: Alberto Garcia <berto@igalia.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'scripts')
-rw-r--r--scripts/qtest.py6
1 files changed, 6 insertions, 0 deletions
diff --git a/scripts/qtest.py b/scripts/qtest.py
index adf1fe3f26..afac3fe900 100644
--- a/scripts/qtest.py
+++ b/scripts/qtest.py
@@ -31,6 +31,7 @@ class QEMUQtestProtocol(object):
"""
self._address = address
self._sock = self._get_sock()
+ self._sockfile = None
if server:
self._sock.bind(self._address)
self._sock.listen(1)
@@ -49,6 +50,7 @@ class QEMUQtestProtocol(object):
@raise socket.error on socket connection errors
"""
self._sock.connect(self._address)
+ self._sockfile = self._sock.makefile()
def accept(self):
"""
@@ -57,6 +59,7 @@ class QEMUQtestProtocol(object):
@raise socket.error on socket connection errors
"""
self._sock, _ = self._sock.accept()
+ self._sockfile = self._sock.makefile()
def cmd(self, qtest_cmd):
"""
@@ -65,9 +68,12 @@ class QEMUQtestProtocol(object):
@param qtest_cmd: qtest command text to be sent
"""
self._sock.sendall((qtest_cmd + "\n").encode('utf-8'))
+ resp = self._sockfile.readline()
+ return resp
def close(self):
self._sock.close()
+ self._sockfile.close()
def settimeout(self, timeout):
self._sock.settimeout(timeout)