[PATCH 0/4] tests: do more testing of block drivers in CI

Daniel P. Berrangé posted 4 patches 1 month, 1 week ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20251008113552.747002-1-berrange@redhat.com
Maintainers: "Alex Bennée" <alex.bennee@linaro.org>, "Philippe Mathieu-Daudé" <philmd@linaro.org>, Thomas Huth <thuth@redhat.com>, Kevin Wolf <kwolf@redhat.com>, Hanna Reitz <hreitz@redhat.com>
.gitlab-ci.d/buildtest.yml       | 63 ++++++++++++++++++++++++++++++++
tests/qemu-iotests/meson.build   | 52 ++++++++++++++++++++------
tests/qemu-iotests/testrunner.py |  2 +-
3 files changed, 104 insertions(+), 13 deletions(-)
[PATCH 0/4] tests: do more testing of block drivers in CI
Posted by Daniel P. Berrangé 1 month, 1 week ago
The recent set of regressions identified in the LUKS block driver
re-inforced that despite having a hugely useful set of I/O tests,
our CI coverage is still letting through too many bugs.

This series expands the meson suites / make targets for running
I/O tests for more drivers, and then creates a CI job for each.

While the first three patches are functionally usable as is, the
last patch for gitlab is very much an RFC. A test pipeline

  https://gitlab.com/berrange/qemu/-/pipelines/2085907042

shows passes for qcow2, qed, vmdk & vpc, but failures for luks,
nbd and raw.

The luks failures all have patchs floating around pending merge.

The nbd failures are problems with non-deterministic output
ordering, or warnings from python deprecations that need
addressing.

The raw failures are problems with python deprecations, and
insufficient permissions checks wrt device mapper acess.

I'm unclear if there are other non-deterministic failures that
would only appear if we start running the tests regularly. That
is a chicken & egg problem though. At some point we have to accept
a (hopefully short) period of instability to tease out the rare
edge cases, in order to get a long term win of better code quality
through CI coverage.

Daniel P. Berrangé (4):
  tests: print reason when I/O test is skipped in TAP mode
  tests: rearrange suites for I/O tests
  tests: add nbd and luks to the I/O test suites
  gitlab: add jobs for thorough block tests

 .gitlab-ci.d/buildtest.yml       | 63 ++++++++++++++++++++++++++++++++
 tests/qemu-iotests/meson.build   | 52 ++++++++++++++++++++------
 tests/qemu-iotests/testrunner.py |  2 +-
 3 files changed, 104 insertions(+), 13 deletions(-)

-- 
2.50.1


Re: [PATCH 0/4] tests: do more testing of block drivers in CI
Posted by Daniel P. Berrangé 1 month, 1 week ago
On Wed, Oct 08, 2025 at 12:35:48PM +0100, Daniel P. Berrangé wrote:
> The recent set of regressions identified in the LUKS block driver
> re-inforced that despite having a hugely useful set of I/O tests,
> our CI coverage is still letting through too many bugs.
> 
> This series expands the meson suites / make targets for running
> I/O tests for more drivers, and then creates a CI job for each.
> 
> While the first three patches are functionally usable as is, the
> last patch for gitlab is very much an RFC. A test pipeline
> 
>   https://gitlab.com/berrange/qemu/-/pipelines/2085907042
> 
> shows passes for qcow2, qed, vmdk & vpc, but failures for luks,
> nbd and raw.
> 
> The luks failures all have patchs floating around pending merge.
> 
> The nbd failures are problems with non-deterministic output
> ordering, or warnings from python deprecations that need
> addressing.
> 
> The raw failures are problems with python deprecations, and
> insufficient permissions checks wrt device mapper acess.

The raw / nbd deprecations are:

/usr/lib64/python3.9/asyncio/trsock.py:20: DeprecationWarning: Using sendmsg() method on sockets returned from get_extra_info('socket') will be prohibited in asyncio 3.9. Please report your use case to bugs.python.org.
  warnings.warn(
DeprecationWarning: Enable tracemalloc to get the object allocation traceback


This comes from send_fd_scm in qmp_client.py where it does

        sock = self._writer.transport.get_extra_info('socket')

        if sock.family != socket.AF_UNIX:
            raise QMPError("Sending file descriptors requires a UNIX socket.")

        if not hasattr(sock, 'sendmsg'):
            # We need to void the warranty sticker.
            # Access to sendmsg is scheduled for removal in Python 3.11.
            # Find the real backing socket to use it anyway.
            sock = sock._sock  # pylint: disable=protected-access

        sock.sendmsg(
            [b' '],
            [(socket.SOL_SOCKET, socket.SCM_RIGHTS, struct.pack('@i', fd))]
        )


As that comment says, the 'sendmsg' method has been removed
from the TransportSock object returned by 'get_extra_info',
with asyncio offering no replacement. The code above grabs
the private sock._sock handle, which is rather gross, but
we lack better options.

The problem in CI is that I picked CentOS 9 which has py 3.9
which still has the 'sendmsg' method. On newer distros
'sendmsg' is gone, so we grab the private sock._sock and
so dno't see a deprecation message.

IMHO we need to revert this previous change, so we avoid
calling the deprecated method at all:

  commit a57cb3e23d5ac918a69d0aab918470ff0b429ff9
  Author: John Snow <jsnow@redhat.com>
  Date:   Thu Nov 18 15:46:20 2021 -0500

    python/aqmp: fix send_fd_scm for python 3.6.x
    
    3.6 doesn't play keepaway with the socket object, so we don't need to go
    fishing for it on this version. In fact, so long as 'sendmsg' is still
    available, it's probably preferable to just use that method and only go
    fishing for forbidden details when we absolutely have to.
    
    Reported-by: Thomas Huth <thuth@redhat.com>
    Signed-off-by: John Snow <jsnow@redhat.com>
    Reviewed-by: Willian Rampazzo <willianr@redhat.com>
    Message-id: 20211118204620.1897674-8-jsnow@redhat.com
    Signed-off-by: John Snow <jsnow@redhat.com>

  diff --git a/python/qemu/aqmp/qmp_client.py b/python/qemu/aqmp/qmp_client.py
  index f987da02eb..8105e29fa8 100644
  --- a/python/qemu/aqmp/qmp_client.py
  +++ b/python/qemu/aqmp/qmp_client.py
  @@ -639,9 +639,12 @@ def send_fd_scm(self, fd: int) -> None:
           if sock.family != socket.AF_UNIX:
               raise AQMPError("Sending file descriptors requires a UNIX socket.")
 
  -        # Void the warranty sticker.
  -        # Access to sendmsg in asyncio is scheduled for removal in Python 3.11.
  -        sock = sock._sock  # pylint: disable=protected-access
  +        if not hasattr(sock, 'sendmsg'):
  +            # We need to void the warranty sticker.
  +            # Access to sendmsg is scheduled for removal in Python 3.11.
  +            # Find the real backing socket to use it anyway.
  +            sock = sock._sock  # pylint: disable=protected-access
  +

The need for 3.6 compat no longer exists since we bumped
min python, so that justification for that original
commit is now obsolete.


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