From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Nicholas Piggin <npiggin@gmail.com>
Cc: "John Snow" <jsnow@redhat.com>, "Cleber Rosa" <crosa@redhat.com>,
"Beraldo Leal" <bleal@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Wainer dos Santos Moschetta" <wainersm@redhat.com>,
qemu-devel@nongnu.org, qemu-ppc@nongnu.org
Subject: Re: [PATCH] tests/avocado: Fix console data loss
Date: Tue, 12 Sep 2023 16:34:28 +0100 [thread overview]
Message-ID: <ZQCFBFJUr6zllKNk@redhat.com> (raw)
In-Reply-To: <20230912131340.405619-1-npiggin@gmail.com>
On Tue, Sep 12, 2023 at 11:13:40PM +1000, Nicholas Piggin wrote:
> Occasionally some avocado tests will fail waiting for console line
> despite the machine running correctly. Console data goes missing, as can
> be seen in the console log. This is due to _console_interaction calling
> makefile() on the console socket each time it is invoked, which must be
> losing old buffer contents when going out of scope.
>
> It is not enough to makefile() with buffered=0. That helps significantly
> but data loss is still possible. My guess is that readline() has a line
> buffer even when the file is in unbuffered mode, that can eat data.
>
> Fix this by providing a console file that persists for the life of the
> console.
>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
>
> For some reason, ppc_prep_40p.py:IbmPrep40pMachine.test_openbios_192m
> was flakey for me due to this bug. I don't know why that in particular,
> 3 calls to wait_for_console_pattern probably helps.
>
> I didn't pinpoint when the bug was introduced because the original
> was probably not buggy because it was only run once at the end of the
> test. At some point after it was moved to common code, something would
> have started to call it more than once which is where potential for bug
> is introduced.
I'm suspecting this patch might also fix many other failures we
see in avocado, all with wait_for_console_pattern in their trace
https://gitlab.com/qemu-project/qemu/-/issues/1884
> python/qemu/machine/machine.py | 19 +++++++++++++++++++
> tests/avocado/avocado_qemu/__init__.py | 2 +-
> 2 files changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/python/qemu/machine/machine.py b/python/qemu/machine/machine.py
> index c16a0b6fed..35d5a672db 100644
> --- a/python/qemu/machine/machine.py
> +++ b/python/qemu/machine/machine.py
> @@ -191,6 +191,7 @@ def __init__(self,
> self.sock_dir, f"{self._name}.con"
> )
> self._console_socket: Optional[socket.socket] = None
> + self._console_file: Optional[socket.SocketIO] = None
> self._remove_files: List[str] = []
> self._user_killed = False
> self._quit_issued = False
> @@ -509,6 +510,11 @@ def _early_cleanup(self) -> None:
> # If we keep the console socket open, we may deadlock waiting
> # for QEMU to exit, while QEMU is waiting for the socket to
> # become writable.
> + if self._console_file is not None:
> + LOG.debug("Closing console file")
> + self._console_file.close()
> + self._console_file = None
> +
> if self._console_socket is not None:
> LOG.debug("Closing console socket")
> self._console_socket.close()
> @@ -874,12 +880,25 @@ def console_socket(self) -> socket.socket:
> Returns a socket connected to the console
> """
> if self._console_socket is None:
> + LOG.debug("Opening console socket")
> self._console_socket = console_socket.ConsoleSocket(
> self._console_address,
> file=self._console_log_path,
> drain=self._drain_console)
> return self._console_socket
>
> + @property
> + def console_file(self) -> socket.SocketIO:
> + """
> + Returns a file associated with the console socket
> + """
> + if self._console_file is None:
> + LOG.debug("Opening console file")
> + self._console_file = self.console_socket.makefile(mode='rb',
> + buffering=0,
> + encoding='utf-8')
> + return self._console_file
> +
> @property
> def temp_dir(self) -> str:
> """
> diff --git a/tests/avocado/avocado_qemu/__init__.py b/tests/avocado/avocado_qemu/__init__.py
> index 33090903f1..0172a359b7 100644
> --- a/tests/avocado/avocado_qemu/__init__.py
> +++ b/tests/avocado/avocado_qemu/__init__.py
> @@ -137,7 +137,7 @@ def _console_interaction(test, success_message, failure_message,
> assert not keep_sending or send_string
> if vm is None:
> vm = test.vm
> - console = vm.console_socket.makefile(mode='rb', encoding='utf-8')
> + console = vm.console_file
> console_logger = logging.getLogger('console')
> while True:
> if send_string:
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
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:[~2023-09-12 15:35 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-12 13:13 [PATCH] tests/avocado: Fix console data loss Nicholas Piggin
2023-09-12 15:34 ` Daniel P. Berrangé [this message]
2023-09-12 16:42 ` Philippe Mathieu-Daudé
2023-09-13 8:51 ` Alex Bennée
2023-09-14 15:24 ` John Snow
2023-09-15 0:07 ` Nicholas Piggin
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=ZQCFBFJUr6zllKNk@redhat.com \
--to=berrange@redhat.com \
--cc=bleal@redhat.com \
--cc=crosa@redhat.com \
--cc=jsnow@redhat.com \
--cc=npiggin@gmail.com \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=wainersm@redhat.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 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.