Commit a5df73ba authored by Alberto Garcia's avatar Alberto Garcia Committed by Kevin Wolf
Browse files

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
8258292e when the machine is under heavy workload.

Signed-off-by: default avatarAlberto Garcia <berto@igalia.com>
Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 78fc3b3a
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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)