summaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
authorJohn Snow2022-01-11 00:28:46 +0100
committerJohn Snow2022-01-21 22:01:31 +0100
commit3b5bf136f5798a4ea2c66875d6337ca3d6b79434 (patch)
treef50b83a4bd78a02e59a485c81cd531a970e65f7f /python
parentpython/aqmp: add __del__ method to legacy interface (diff)
downloadqemu-3b5bf136f5798a4ea2c66875d6337ca3d6b79434.tar.gz
qemu-3b5bf136f5798a4ea2c66875d6337ca3d6b79434.tar.xz
qemu-3b5bf136f5798a4ea2c66875d6337ca3d6b79434.zip
python/aqmp: handle asyncio.TimeoutError on execute()
This exception can be injected into any await statement. If we are canceled via timeout, we want to clear the pending execution record on our way out. Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Beraldo Leal <bleal@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Diffstat (limited to 'python')
-rw-r--r--python/qemu/aqmp/qmp_client.py8
1 files changed, 6 insertions, 2 deletions
diff --git a/python/qemu/aqmp/qmp_client.py b/python/qemu/aqmp/qmp_client.py
index 8105e29fa8..6a985ffe30 100644
--- a/python/qemu/aqmp/qmp_client.py
+++ b/python/qemu/aqmp/qmp_client.py
@@ -435,7 +435,11 @@ class QMPClient(AsyncProtocol[Message], Events):
msg_id = msg['id']
self._pending[msg_id] = asyncio.Queue(maxsize=1)
- await self._outgoing.put(msg)
+ try:
+ await self._outgoing.put(msg)
+ except:
+ del self._pending[msg_id]
+ raise
return msg_id
@@ -452,9 +456,9 @@ class QMPClient(AsyncProtocol[Message], Events):
was lost, or some other problem.
"""
queue = self._pending[msg_id]
- result = await queue.get()
try:
+ result = await queue.get()
if isinstance(result, ExecInterruptedError):
raise result
return result