From: John Snow <jsnow@redhat.com>
To: Kevin Wolf <kwolf@redhat.com>
Cc: qemu-block@nongnu.org, Max Reitz <mreitz@redhat.com>,
qemu-devel@nongnu.org, Eduardo Habkost <ehabkost@redhat.com>,
Cleber Rosa <crosa@redhat.com>
Subject: Re: [PATCH 18/20] python/qemu/qmp.py: re-raise OSError when encountered
Date: Thu, 8 Oct 2020 19:41:59 -0400 [thread overview]
Message-ID: <dd7c4b82-8e29-db84-4f27-dc0ac42c4245@redhat.com> (raw)
In-Reply-To: <c0ab4401-3c13-47ab-8b07-b1046e488a61@redhat.com>
On 10/7/20 3:17 PM, John Snow wrote:
> On 10/7/20 7:30 AM, Kevin Wolf wrote:
>> Am 07.10.2020 um 01:58 hat John Snow geschrieben:
>>> Nested if conditions don't change when the exception block fires; we
>>> need to explicitly re-raise the error if we didn't intend to capture and
>>> suppress it.
>>>
>>> Signed-off-by: John Snow <jsnow@redhat.com>
>>> ---
>>> python/qemu/qmp.py | 6 +++---
>>> 1 file changed, 3 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/python/qemu/qmp.py b/python/qemu/qmp.py
>>> index d911999da1f..bdbd1e9bdbb 100644
>>> --- a/python/qemu/qmp.py
>>> +++ b/python/qemu/qmp.py
>>> @@ -169,9 +169,9 @@ def __get_events(self, wait: Union[bool, float] =
>>> False) -> None:
>>> try:
>>> self.__json_read()
>>> except OSError as err:
>>> - if err.errno == errno.EAGAIN:
>>> - # No data available
>>> - pass
>>> + # EAGAIN: No data available; not critical
>>> + if err.errno != errno.EAGAIN:
>>> + raise
>>
>> Hm, if we re-raise the exception here, the socket remains non-blocking.
>> I think we intended to have it like that only temporarily.
>>
>
> Whoops. Yep, no good to go from one kind of broken to a different kind
> of broken.
>
Actually, wanna know a funny story?
I think the reason this never broke anything is because sockfiles aren't
suppose to be used in nonblocking mode -- their behavior is not
documented in this case.
In practice, what actually seems to happen when you set non-blocking
mode and then call sockfile.readline() is that you get an empty string.
This means you get 'None' from __json_read, and so on.
Why doesn't this bite us more often? Well, we don't actually check the
return value when we're using this in non-blocking mode, so I suppose
that's the primary reason.
I don't know if the behavior of Python changed at some point, I can try
to patch this up for how Python *seems* to work, but we should probably
do a more meaningful fix to get away from undefined behavior sometime soon.
I had some async prototypes hanging around, maybe it's time to try and
give that a more solid effort ...
Related note:
Even in blocking mode, you might get an empty reply from readline which
means EOF and not just "try again."
You'll see this in the case where you already have QEMU running from a
previous failed test, and you start a new iotest up. When QMP calls
accept(), the QMP capabilities handshake fails because it gets "None"
from __json_read.
Confusing error for what's actually going on there. It's actually that
the socket is at EOF.
next prev parent reply other threads:[~2020-10-08 23:43 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-06 23:57 [PATCH 00/20] python/qemu: strictly typed mypy conversion, pt2 John Snow
2020-10-06 23:57 ` [PATCH 01/20] python/qemu: use isort to lay out imports John Snow
2020-10-07 4:53 ` Philippe Mathieu-Daudé
2020-10-07 9:45 ` Kevin Wolf
2020-10-06 23:57 ` [PATCH 02/20] python/machine.py: Fix monitor address typing John Snow
2020-10-06 23:58 ` [PATCH 03/20] python/machine.py: reorder __init__ John Snow
2020-10-07 4:53 ` Philippe Mathieu-Daudé
2020-10-07 9:43 ` Kevin Wolf
2020-10-07 18:16 ` John Snow
2020-10-06 23:58 ` [PATCH 04/20] python/machine.py: Don't modify state in _base_args() John Snow
2020-10-06 23:58 ` [PATCH 05/20] python/machine.py: Handle None events in events_wait John Snow
2020-10-06 23:58 ` [PATCH 06/20] python/machine.py: use qmp.command John Snow
2020-10-07 4:54 ` Philippe Mathieu-Daudé
2020-10-06 23:58 ` [PATCH 07/20] python/machine.py: Add _qmp access shim John Snow
2020-10-07 9:53 ` Kevin Wolf
2020-10-07 18:21 ` John Snow
2020-10-06 23:58 ` [PATCH 08/20] python/machine.py: fix _popen access John Snow
2020-10-07 10:07 ` Kevin Wolf
2020-10-07 18:44 ` John Snow
2020-10-08 7:04 ` Kevin Wolf
2020-10-08 15:29 ` John Snow
2020-10-06 23:58 ` [PATCH 09/20] python/qemu: make 'args' style arguments immutable John Snow
2020-10-07 4:55 ` Philippe Mathieu-Daudé
2020-10-06 23:58 ` [PATCH 10/20] iotests.py: Adjust HMP kwargs typing John Snow
2020-10-06 23:58 ` [PATCH 11/20] python/qemu: Add mypy type annotations John Snow
2020-10-07 10:46 ` Kevin Wolf
2020-10-07 18:48 ` John Snow
2020-10-06 23:58 ` [PATCH 12/20] python/qemu/console_socket.py: Correct type of recv() John Snow
2020-10-07 10:59 ` Kevin Wolf
2020-10-07 18:49 ` John Snow
2020-10-06 23:58 ` [PATCH 13/20] python/qemu/console_socket.py: fix typing of settimeout John Snow
2020-10-07 10:59 ` Kevin Wolf
2020-10-06 23:58 ` [PATCH 14/20] python/qemu/console_socket.py: Clarify type of drain_thread John Snow
2020-10-07 10:59 ` Kevin Wolf
2020-10-06 23:58 ` [PATCH 15/20] python/qemu/console_socket.py: Add type hint annotations John Snow
2020-10-07 11:01 ` Kevin Wolf
2020-10-06 23:58 ` [PATCH 16/20] python/console_socket: avoid encoding to/from string John Snow
2020-10-07 11:10 ` Kevin Wolf
2020-10-06 23:58 ` [PATCH 17/20] python/qemu/qmp.py: Preserve error context on re-raise John Snow
2020-10-07 4:58 ` Philippe Mathieu-Daudé
2020-10-07 11:21 ` Kevin Wolf
2020-10-07 19:03 ` John Snow
2020-10-06 23:58 ` [PATCH 18/20] python/qemu/qmp.py: re-raise OSError when encountered John Snow
2020-10-07 4:59 ` Philippe Mathieu-Daudé
2020-10-07 11:30 ` Kevin Wolf
2020-10-07 19:17 ` John Snow
2020-10-08 23:41 ` John Snow [this message]
2020-10-06 23:58 ` [PATCH 19/20] python/qemu/qmp.py: Straighten out exception hierarchy John Snow
2020-10-07 12:53 ` Kevin Wolf
2020-10-06 23:58 ` [PATCH 20/20] python: add mypy config John Snow
2020-10-07 11:35 ` Kevin Wolf
2020-10-07 19:08 ` John Snow
2020-10-08 15:29 ` [PATCH 00/20] python/qemu: strictly typed mypy conversion, pt2 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=dd7c4b82-8e29-db84-4f27-dc0ac42c4245@redhat.com \
--to=jsnow@redhat.com \
--cc=crosa@redhat.com \
--cc=ehabkost@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.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 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).