[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 04/17] python/aqmp: add __del__ method to legacy interface
|
From: |
John Snow |
|
Subject: |
[PULL 04/17] python/aqmp: add __del__ method to legacy interface |
|
Date: |
Fri, 21 Jan 2022 19:09:18 -0500 |
asyncio can complain *very* loudly if you forget to back out of things
gracefully before the garbage collector starts destroying objects that
contain live references to asyncio Tasks.
The usual fix is just to remember to call aqmp.disconnect(), but for the
sake of the legacy wrapper and quick, one-off scripts where a graceful
shutdown is not necessarily of paramount imporance, add a courtesy
cleanup that will trigger prior to seeing screenfuls of confusing
asyncio tracebacks.
Note that we can't *always* save you from yourself; depending on when
the GC runs, you might just seriously be out of luck. The best we can do
in this case is to gently remind you to clean up after yourself.
(Still much better than multiple pages of incomprehensible python
warnings for the crime of forgetting to put your toys away.)
Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Beraldo Leal <bleal@redhat.com>
---
python/qemu/aqmp/legacy.py | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/python/qemu/aqmp/legacy.py b/python/qemu/aqmp/legacy.py
index 9e7b9fb80b..2ccb136b02 100644
--- a/python/qemu/aqmp/legacy.py
+++ b/python/qemu/aqmp/legacy.py
@@ -16,6 +16,8 @@
import qemu.qmp
from qemu.qmp import QMPMessage, QMPReturnValue, SocketAddrT
+from .error import AQMPError
+from .protocol import Runstate
from .qmp_client import QMPClient
@@ -136,3 +138,19 @@ def settimeout(self, timeout: Optional[float]) -> None:
def send_fd_scm(self, fd: int) -> None:
self._aqmp.send_fd_scm(fd)
+
+ def __del__(self) -> None:
+ if self._aqmp.runstate == Runstate.IDLE:
+ return
+
+ if not self._aloop.is_running():
+ self.close()
+ else:
+ # Garbage collection ran while the event loop was running.
+ # Nothing we can do about it now, but if we don't raise our
+ # own error, the user will be treated to a lot of traceback
+ # they might not understand.
+ raise AQMPError(
+ "QEMUMonitorProtocol.close()"
+ " was not called before object was garbage collected"
+ )
--
2.31.1
- [PULL 00/17] Python patches, John Snow, 2022/01/21
- [PULL 02/17] python: use avocado's "new" runner, John Snow, 2022/01/21
- [PULL 03/17] python/aqmp: fix docstring typo, John Snow, 2022/01/21
- [PULL 01/17] python: pin setuptools below v60.0.0, John Snow, 2022/01/21
- [PULL 05/17] python/aqmp: handle asyncio.TimeoutError on execute(), John Snow, 2022/01/21
- [PULL 04/17] python/aqmp: add __del__ method to legacy interface,
John Snow <=
- [PULL 06/17] python/aqmp: copy type definitions from qmp, John Snow, 2022/01/21
- [PULL 08/17] python/aqmp: rename AQMPError to QMPError, John Snow, 2022/01/21
- [PULL 09/17] python/qemu-ga-client: don't use deprecated CLI syntax in usage comment, John Snow, 2022/01/21
- [PULL 07/17] python/aqmp: add SocketAddrT to package root, John Snow, 2022/01/21
- [PULL 12/17] python/qmp: switch qmp-shell to AQMP, John Snow, 2022/01/21
- [PULL 13/17] python: move qmp utilities to python/qemu/utils, John Snow, 2022/01/21
- [PULL 16/17] scripts/cpu-x86-uarch-abi: switch to AQMP, John Snow, 2022/01/21
- [PULL 14/17] python: move qmp-shell under the AQMP package, John Snow, 2022/01/21
- [PULL 15/17] scripts/cpu-x86-uarch-abi: fix CLI parsing, John Snow, 2022/01/21
- [PULL 10/17] python/qmp: switch qemu-ga-client to AQMP, John Snow, 2022/01/21