qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: John Snow <jsnow@redhat.com>
To: qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
	Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
	Eduardo Habkost <ehabkost@redhat.com>,
	qemu-block@nongnu.org, Markus Armbruster <armbru@redhat.com>,
	Hanna Reitz <hreitz@redhat.com>,
	Gerd Hoffmann <kraxel@redhat.com>, Cleber Rosa <crosa@redhat.com>,
	John Snow <jsnow@redhat.com>
Subject: [PATCH 01/23] python/aqmp: add __del__ method to legacy interface
Date: Wed, 24 Nov 2021 14:25:55 -0500	[thread overview]
Message-ID: <20211124192617.3396403-2-jsnow@redhat.com> (raw)
In-Reply-To: <20211124192617.3396403-1-jsnow@redhat.com>

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>
---
 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



  reply	other threads:[~2021-11-24 19:29 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-24 19:25 [PATCH 00/23] Python: delete qemu.qmp package John Snow
2021-11-24 19:25 ` John Snow [this message]
2021-11-24 19:25 ` [PATCH 02/23] python/aqmp: handle asyncio.TimeoutError on execute() John Snow
2021-11-24 19:25 ` [PATCH 03/23] python/aqmp: copy type definitions from qmp John Snow
2021-11-24 19:25 ` [PATCH 04/23] python/aqmp: add SocketAddrT to package root John Snow
2021-11-24 19:25 ` [PATCH 05/23] python/qemu-ga-client: update instructions to newer CLI syntax John Snow
2021-11-24 19:26 ` [PATCH 06/23] python/qmp: switch qemu-ga-client to AQMP John Snow
2021-11-24 19:26 ` [PATCH 07/23] python/qmp: switch qom tools " John Snow
2021-11-24 19:26 ` [PATCH 08/23] python/qmp: switch qmp-shell " John Snow
2021-11-24 19:26 ` [PATCH 09/23] python: move qmp utilities to python/qemu/utils John Snow
2021-11-24 19:26 ` [PATCH 10/23] python: move qmp-shell under the AQMP package John Snow
2021-11-24 19:26 ` [PATCH 11/23] python/machine: permanently switch to AQMP John Snow
2021-11-24 19:26 ` [PATCH 12/23] scripts/cpu-x86-uarch-abi: fix CLI parsing John Snow
2021-11-24 19:26 ` [PATCH 13/23] scripts/cpu-x86-uarch-abi: switch to AQMP John Snow
2021-11-24 19:26 ` [PATCH 14/23] scripts/render-block-graph: " John Snow
2021-11-24 19:26 ` [PATCH 15/23] scripts/bench-block-job: " John Snow
2021-11-24 19:26 ` [PATCH 16/23] iotests/mirror-top-perms: " John Snow
2021-11-24 19:26 ` [PATCH 17/23] iotests: " John Snow
2021-11-24 19:26 ` [PATCH 18/23] python: temporarily silence pylint duplicate-code warnings John Snow
2021-11-24 19:26 ` [PATCH 19/23] python/aqmp: take QMPBadPortError and parse_address from qemu.qmp John Snow
2021-11-24 19:26 ` [PATCH 20/23] python/aqmp: fully separate from qmp.QEMUMonitorProtocol John Snow
2021-11-24 19:26 ` [PATCH 21/23] python/aqmp: copy qmp docstrings to qemu.aqmp.legacy John Snow
2021-11-24 19:26 ` [PATCH 22/23] python: remove the old QMP package John Snow
2021-11-24 19:26 ` [PATCH 23/23] python: re-enable pylint duplicate-code warnings John Snow

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211124192617.3396403-2-jsnow@redhat.com \
    --to=jsnow@redhat.com \
    --cc=armbru@redhat.com \
    --cc=crosa@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=hreitz@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=vsementsov@virtuozzo.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).