Am Mi., 7. Okt. 2026 um 15:27 Uhr schrieb Peter Xu <[email protected]>:
>
> On Mon, Sep 21, 2026 at 08:03:45PM +0100, Alex Bennée wrote:
> > This is a hacky patch for comment but I've included the diagnostic
> > hacks to the migration test as well as my workaround to get itworking.
> >
> > This test was failing on my KVM system. On investigation I found the
> > nVME activity meant the migration never completed. I ended up
> > inserting some sleeps into the workload script until I was able to
> > get it to run.
>
> Indeed, I can reproduce it too:
>
> $ ./run ../tests/functional/x86_64/test_nvme_migration.py 
> X8664NVMeMigrationTest.test_migration_with_unix
> TAP version 13
> Traceback (most recent call last):
>   File "/home/zhexu/git/qemu/tests/functional/x86_64/test_nvme_migration.py", 
> line 162, in test_migration_with_unix
>     self.migration_with_unix()
>     ~~~~~~~~~~~~~~~~~~~~~~~~^^
>   File "/home/zhexu/git/qemu/tests/functional/migration.py", line 98, in 
> migration_with_unix
>     self.migrate(dst_uri)
>     ~~~~~~~~~~~~^^^^^^^^^
>   File "/home/zhexu/git/qemu/tests/functional/migration.py", line 78, in 
> migrate
>     self.migrate_vms(dst_uri, src_uri, dst_vm, src_vm)
>     ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/home/zhexu/git/qemu/tests/functional/migration.py", line 63, in 
> migrate_vms
>     self.assert_dest_vm(dst_vm)
>     ~~~~~~~~~~~~~~~~~~~^^^^^^^^
>   File "/home/zhexu/git/qemu/tests/functional/x86_64/test_nvme_migration.py", 
> line 128, in assert_dest_vm
>     self.exec_command_and_check(
>     ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
>         "kill -0 $(cat /tmp/test_nvme_mig_workload.pid)", vm)
>         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/home/zhexu/git/qemu/tests/functional/x86_64/test_nvme_migration.py", 
> line 48, in exec_command_and_check
>     wait_for_console_pattern(self, 'OK', failure_message="FAIL", vm=vm)
>     ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/home/zhexu/git/qemu/tests/functional/qemu_test/cmd.py", line 191, in 
> wait_for_console_pattern
>     return _console_interaction(test, success_message, failure_message,
>                                 None, vm=vm)
>   File "/home/zhexu/git/qemu/tests/functional/qemu_test/cmd.py", line 134, in 
> _console_interaction
>     done, line = _console_read_line_until_match(test, vm,
>                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^
>                                                 success_message_b,
>                                                 ^^^^^^^^^^^^^^^^^^
>                                                 failure_message_b)
>                                                 ^^^^^^^^^^^^^^^^^^
>   File "/home/zhexu/git/qemu/tests/functional/qemu_test/cmd.py", line 70, in 
> _console_read_line_until_match
>     test.fail(
>     ~~~~~~~~~^
>         f"'{failure}' found in console, expected '{success}'")
>         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> AssertionError: 'b'FAIL'' found in console, expected 'b'OK''
>
> not ok 1 test_nvme_migration.X8664NVMeMigrationTest.test_migration_with_unix
> 1..1

Dear friends,

>
> Copy the author too (Alexander).

thanks for letting me know. This is definitely something I *must* look
into and fix then.
Probably I messed up with synchronization in this test... :-)

I'll take a closer look after get back from the Linux Plumbers (by any
chance, if somebody
at LPC too it would be great to say hi to each other in person :-) )

Kind regards,
Alex

>
> >
> > *NOTE*: obviously this can't be merged as is but I think we could
> > certainly do with more tracking in the test to see when things aren't
> > working with possibly the sleep as another patch.
> >
> > Signed-off-by: Alex Bennée <[email protected]>
> > ---
> >  tests/functional/migration.py                 | 37 +++++++++++++++----
> >  .../functional/x86_64/test_nvme_migration.py  |  1 +
> >  2 files changed, 31 insertions(+), 7 deletions(-)
> >
> > diff --git a/tests/functional/migration.py b/tests/functional/migration.py
> > index 8d2428efc24..e51a82c22f4 100644
> > --- a/tests/functional/migration.py
> > +++ b/tests/functional/migration.py
> > @@ -22,18 +22,41 @@ class MigrationTest(QemuSystemTest):
> >      timeout = 10
> >
> >      @staticmethod
> > -    def migration_finished(vm):
> > -        return vm.cmd('query-migrate')['status'] in ('completed', 'failed')
> > +    def migration_finished(query):
> > +        return query['status'] in ('completed', 'failed')
> >
> > -    def assert_migration(self, src_vm, dst_vm):
> > +    def wait_for_vm(self, src_or_dst, vm):
> > +        "Track the state of one VM in the migration"
> > +        current_state = last_state = vm.cmd('query-migrate')
> >
> > -        end = time.monotonic() + self.timeout
> > -        while time.monotonic() < end and not 
> > self.migration_finished(src_vm):
> > -            time.sleep(0.1)
> > +        self.log.info(f"waiting for {src_or_dst} to complete")
> >
> >          end = time.monotonic() + self.timeout
> > -        while time.monotonic() < end and not 
> > self.migration_finished(dst_vm):
> > +        while time.monotonic() < end:
> > +            if self.migration_finished(current_state):
> > +                break
> > +            else:
> > +                last_remain = last_state['remaining']
> > +                current_remain = current_state['remaining']
> > +
> > +                if current_remain > last_remain:
> > +                    self.log.warning(f"slow migration {current_remain} > 
> > {last_remain}")
> > +
> >              time.sleep(0.1)
> > +            last_state = current_state
> > +            current_state = vm.cmd('query-migrate')
> > +
> > +
> > +    def assert_migration(self, src_vm, dst_vm):
> > +
> > +        self.wait_for_vm("src", src_vm)
> > +
> > +        # if we hit this we never completed...
> > +        self.assertEqual(src_vm.cmd('query-migrate')['status'], 
> > 'completed')
> > +
> > +        self.wait_for_vm("dst", dst_vm)
> > +
> > +        self.log.info("checking everything is OK")
> >
> >          self.assertEqual(src_vm.cmd('query-migrate')['status'], 
> > 'completed')
> >          self.assertEqual(dst_vm.cmd('query-migrate')['status'], 
> > 'completed')
> > diff --git a/tests/functional/x86_64/test_nvme_migration.py 
> > b/tests/functional/x86_64/test_nvme_migration.py
> > index 890f0aab6d6..58596f63cd3 100755
> > --- a/tests/functional/x86_64/test_nvme_migration.py
> > +++ b/tests/functional/x86_64/test_nvme_migration.py
> > @@ -109,6 +109,7 @@ def launch_source_vm(self, vm):
> >                  rm -f /tmp/test_nvme_mig_workload.iter_finished; \
> >                  echo 3 > /proc/sys/vm/drop_caches; \
> >                  find /usr/bin -type f -exec cksum {} \\;; \
> > +                sleep 0.3; \
> >                  touch /tmp/test_nvme_mig_workload.iter_finished; \
> >              done) > /dev/null 2> /tmp/test_nvme_mig_workload.errors &",
> >              prompt, vm=vm)
> > --
> > 2.47.3
> >
>
> --
> Peter Xu
>

Reply via email to