iotests: Make 234 stable
authorMax Reitz <mreitz@redhat.com>
Fri, 21 Dec 2018 18:42:26 +0000 (19:42 +0100)
committerKevin Wolf <kwolf@redhat.com>
Fri, 1 Feb 2019 12:46:44 +0000 (13:46 +0100)
This test waits for a MIGRATION event with status=completed on the
source VM before querying the migration status on both source and
destination.  However, just because the source says migration has
completed does not mean the destination thinks the same.  Therefore, in
some cases, the destination VM may still report "active" instead of
"completed" when asked for its migration status.

Fix this by enabling migration events on both VMs and waiting until both
source and destination emit a status=completed MIGRATION event.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
tests/qemu-iotests/234
tests/qemu-iotests/234.out

index a8185b4360b1ee25dc0ed3d354b55b5e75c21ece..c4c26bc21ee7ab4a5e7e44ff5d42c589ea68e86b 100755 (executable)
@@ -26,6 +26,22 @@ import os
 iotests.verify_image_format(supported_fmts=['qcow2'])
 iotests.verify_platform(['linux'])
 
+def enable_migration_events(vm, name):
+    iotests.log('Enabling migration QMP events on %s...' % name)
+    iotests.log(vm.qmp('migrate-set-capabilities', capabilities=[
+        {
+            'capability': 'events',
+            'state': True
+        }
+    ]))
+
+def wait_migration(vm):
+    while True:
+        event = vm.event_wait('MIGRATION')
+        iotests.log(event, filters=[iotests.filter_qmp_event])
+        if event['data']['status'] == 'completed':
+            break
+
 with iotests.FilePath('img') as img_path, \
      iotests.FilePath('backing') as backing_path, \
      iotests.FilePath('mig_fifo_a') as fifo_a, \
@@ -46,6 +62,8 @@ with iotests.FilePath('img') as img_path, \
          .add_blockdev('%s,file=drive0-backing-file,node-name=drive0-backing' % (iotests.imgfmt))
          .launch())
 
+    enable_migration_events(vm_a, 'A')
+
     iotests.log('Launching destination VM...')
     (vm_b.add_blockdev('file,filename=%s,node-name=drive0-file' % (img_path))
          .add_blockdev('%s,file=drive0-file,node-name=drive0' % (iotests.imgfmt))
@@ -54,6 +72,8 @@ with iotests.FilePath('img') as img_path, \
          .add_incoming("exec: cat '%s'" % (fifo_a))
          .launch())
 
+    enable_migration_events(vm_b, 'B')
+
     # Add a child node that was created after the parent node. The reverse case
     # is covered by the -blockdev options above.
     iotests.log(vm_a.qmp('blockdev-snapshot', node='drive0-backing',
@@ -61,22 +81,13 @@ with iotests.FilePath('img') as img_path, \
     iotests.log(vm_b.qmp('blockdev-snapshot', node='drive0-backing',
                          overlay='drive0'))
 
-    iotests.log('Enabling migration QMP events on A...')
-    iotests.log(vm_a.qmp('migrate-set-capabilities', capabilities=[
-        {
-            'capability': 'events',
-            'state': True
-        }
-    ]))
-
     iotests.log('Starting migration to B...')
     iotests.log(vm_a.qmp('migrate', uri='exec:cat >%s' % (fifo_a)))
     with iotests.Timeout(3, 'Migration does not complete'):
-        while True:
-            event = vm_a.event_wait('MIGRATION')
-            iotests.log(event, filters=[iotests.filter_qmp_event])
-            if event['data']['status'] == 'completed':
-                break
+        # Wait for the source first (which includes setup=setup)
+        wait_migration(vm_a)
+        # Wait for the destination second (which does not)
+        wait_migration(vm_b)
 
     iotests.log(vm_a.qmp('query-migrate')['return']['status'])
     iotests.log(vm_b.qmp('query-migrate')['return']['status'])
@@ -94,25 +105,18 @@ with iotests.FilePath('img') as img_path, \
          .add_incoming("exec: cat '%s'" % (fifo_b))
          .launch())
 
+    enable_migration_events(vm_a, 'A')
+
     iotests.log(vm_a.qmp('blockdev-snapshot', node='drive0-backing',
                          overlay='drive0'))
 
-    iotests.log('Enabling migration QMP events on B...')
-    iotests.log(vm_b.qmp('migrate-set-capabilities', capabilities=[
-        {
-            'capability': 'events',
-            'state': True
-        }
-    ]))
-
     iotests.log('Starting migration back to A...')
     iotests.log(vm_b.qmp('migrate', uri='exec:cat >%s' % (fifo_b)))
     with iotests.Timeout(3, 'Migration does not complete'):
-        while True:
-            event = vm_b.event_wait('MIGRATION')
-            iotests.log(event, filters=[iotests.filter_qmp_event])
-            if event['data']['status'] == 'completed':
-                break
+        # Wait for the source first (which includes setup=setup)
+        wait_migration(vm_b)
+        # Wait for the destination second (which does not)
+        wait_migration(vm_a)
 
     iotests.log(vm_a.qmp('query-migrate')['return']['status'])
     iotests.log(vm_b.qmp('query-migrate')['return']['status'])
index b9ed910b1afbed95df6eb304c67da5ba23b73b8e..692976d1c6a7c151e6dac880fd6ba58af8fb387b 100644 (file)
@@ -1,14 +1,18 @@
 Launching source VM...
+Enabling migration QMP events on A...
+{"return": {}}
 Launching destination VM...
+Enabling migration QMP events on B...
 {"return": {}}
 {"return": {}}
-Enabling migration QMP events on A...
 {"return": {}}
 Starting migration to B...
 {"return": {}}
 {"data": {"status": "setup"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
 {"data": {"status": "active"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
 {"data": {"status": "completed"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
+{"data": {"status": "active"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
+{"data": {"status": "completed"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
 completed
 completed
 {"return": {"running": false, "singlestep": false, "status": "postmigrate"}}
@@ -16,14 +20,16 @@ completed
 Add a second parent to drive0-file...
 {"return": {}}
 Restart A with -incoming and second parent...
+Enabling migration QMP events on A...
 {"return": {}}
-Enabling migration QMP events on B...
 {"return": {}}
 Starting migration back to A...
 {"return": {}}
 {"data": {"status": "setup"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
 {"data": {"status": "active"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
 {"data": {"status": "completed"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
+{"data": {"status": "active"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
+{"data": {"status": "completed"}, "event": "MIGRATION", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
 completed
 completed
 {"return": {"running": true, "singlestep": false, "status": "running"}}