From: "Daniel P. Berrangé" <berrange@redhat.com>
To: marcandre.lureau@redhat.com
Cc: qemu-devel@nongnu.org, John Snow <jsnow@redhat.com>,
Richard Henderson <richard.henderson@linaro.org>,
Beraldo Leal <bleal@redhat.com>, Cleber Rosa <crosa@redhat.com>
Subject: Re: [PATCH 2/2] python/qemu/machine: accept QMP connection asynchronously
Date: Tue, 28 Jun 2022 15:17:08 +0100 [thread overview]
Message-ID: <YrsNZAznZrxUr/zr@redhat.com> (raw)
In-Reply-To: <20220628134939.680174-3-marcandre.lureau@redhat.com>
On Tue, Jun 28, 2022 at 05:49:39PM +0400, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
>
> QMP accept is currently synchronous. If qemu dies before the connection
> is established, it will wait there. Instead turn the code to do
> concurrently accept() and wait(). Returns when the first task is
> completed to determine whether a connection was established.
If the spawned QEMU process was given -daemonize, won't this code
mistakenly think the subprocess has quit ?
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
> python/qemu/machine/machine.py | 11 ++++++++++-
> python/qemu/qmp/legacy.py | 10 ++++++++++
> 2 files changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/python/qemu/machine/machine.py b/python/qemu/machine/machine.py
> index 55c45f4b1205..5e2df7dc5055 100644
> --- a/python/qemu/machine/machine.py
> +++ b/python/qemu/machine/machine.py
> @@ -362,9 +362,18 @@ def _pre_launch(self) -> None:
> self._args
> ))
>
> + async def _async_accept(self) -> bool:
> + accept = asyncio.create_task(self._qmp.async_accept())
> + wait = asyncio.create_task(self._subproc.wait())
> + done, pending = await asyncio.wait([accept, wait],
> + return_when=asyncio.FIRST_COMPLETED)
> + return accept in done
> +
> def _post_launch(self) -> None:
> if self._qmp_connection:
> - self._qmp.accept(self._qmp_timer)
> + accepted = self._sync(self._async_accept())
> + if not accepted:
> + raise QEMUMachineError('VM returned before QMP accept')
>
> def _close_qemu_log_file(self) -> None:
> if self._qemu_log_file is not None:
> diff --git a/python/qemu/qmp/legacy.py b/python/qemu/qmp/legacy.py
> index 03b5574618fa..88bdbfb6e350 100644
> --- a/python/qemu/qmp/legacy.py
> +++ b/python/qemu/qmp/legacy.py
> @@ -167,6 +167,16 @@ def accept(self, timeout: Optional[float] = 15.0) -> QMPMessage:
> assert ret is not None
> return ret
>
> + async def async_accept(self) -> QMPMessage:
> + self._qmp.await_greeting = True
> + self._qmp.negotiate = True
> +
> + await self._qmp.accept()
> +
> + ret = self._get_greeting()
> + assert ret is not None
> + return ret
> +
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
next prev parent reply other threads:[~2022-06-28 14:19 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-28 13:49 [PATCH 0/2] python/qemu/machine: fix potential hang in QMP accept marcandre.lureau
2022-06-28 13:49 ` [PATCH 1/2] python/qemu/machine: replace subprocess.Popen with asyncio marcandre.lureau
2022-06-28 13:49 ` [PATCH 2/2] python/qemu/machine: accept QMP connection asynchronously marcandre.lureau
2022-06-28 14:17 ` Daniel P. Berrangé [this message]
2022-06-29 23:54 ` John Snow
2022-06-30 8:23 ` Daniel P. Berrangé
2022-06-30 22:43 ` John Snow
2022-06-28 14:26 ` [PATCH 0/2] python/qemu/machine: fix potential hang in QMP accept Daniel P. Berrangé
2022-06-28 17:08 ` John Snow
2022-06-29 10:51 ` Marc-André Lureau
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=YrsNZAznZrxUr/zr@redhat.com \
--to=berrange@redhat.com \
--cc=bleal@redhat.com \
--cc=crosa@redhat.com \
--cc=jsnow@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.