[libvirt PATCH 55/80] qmeu: Refactor qemuMigrationSrcPerformPhase

Jiri Denemark posted 80 patches 3 years, 9 months ago
There is a newer version of this series
[libvirt PATCH 55/80] qmeu: Refactor qemuMigrationSrcPerformPhase
Posted by Jiri Denemark 3 years, 9 months ago
To make the code flow a bit more sensible.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
---
 src/qemu/qemu_migration.c | 26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 99b1d4b88b..dd18a4ad63 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -5819,29 +5819,27 @@ qemuMigrationSrcPerformPhase(virQEMUDriver *driver,
     }
 
     if (qemuMigrationJobStartPhase(vm, QEMU_MIGRATION_PHASE_PERFORM3) < 0)
-        goto endjob;
+        goto cleanup;
 
     virCloseCallbacksUnset(driver->closeCallbacks, vm,
                            qemuMigrationSrcCleanup);
 
-    ret = qemuMigrationSrcPerformNative(driver, vm, persist_xml, uri, cookiein, cookieinlen,
-                                        cookieout, cookieoutlen,
-                                        flags, resource, NULL, graphicsuri,
-                                        nmigrate_disks, migrate_disks, migParams, nbdURI);
-
-    if (ret < 0) {
-        qemuMigrationSrcRestoreDomainState(driver, vm);
-        goto endjob;
-    }
-
-    ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_PERFORM3_DONE));
+    if (qemuMigrationSrcPerformNative(driver, vm, persist_xml, uri, cookiein, cookieinlen,
+                                      cookieout, cookieoutlen,
+                                      flags, resource, NULL, graphicsuri,
+                                      nmigrate_disks, migrate_disks, migParams, nbdURI) < 0)
+        goto cleanup;
 
     if (virCloseCallbacksSet(driver->closeCallbacks, vm, conn,
                              qemuMigrationSrcCleanup) < 0)
-        goto endjob;
+        goto cleanup;
 
- endjob:
+    ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_PERFORM3_DONE));
+    ret = 0;
+
+ cleanup:
     if (ret < 0 && !virDomainObjIsFailedPostcopy(vm)) {
+        qemuMigrationSrcRestoreDomainState(driver, vm);
         qemuMigrationParamsReset(driver, vm, VIR_ASYNC_JOB_MIGRATION_OUT,
                                  jobPriv->migParams, priv->job.apiFlags);
         qemuMigrationJobFinish(vm);
-- 
2.35.1
Re: [libvirt PATCH 55/80] qmeu: Refactor qemuMigrationSrcPerformPhase
Posted by Peter Krempa 3 years, 9 months ago
On Tue, May 10, 2022 at 17:21:16 +0200, Jiri Denemark wrote:
> To make the code flow a bit more sensible.
> 
> Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
> ---
>  src/qemu/qemu_migration.c | 26 ++++++++++++--------------
>  1 file changed, 12 insertions(+), 14 deletions(-)
> 
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index 99b1d4b88b..dd18a4ad63 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -5819,29 +5819,27 @@ qemuMigrationSrcPerformPhase(virQEMUDriver *driver,
>      }
>  
>      if (qemuMigrationJobStartPhase(vm, QEMU_MIGRATION_PHASE_PERFORM3) < 0)
> -        goto endjob;
> +        goto cleanup;
>  
>      virCloseCallbacksUnset(driver->closeCallbacks, vm,
>                             qemuMigrationSrcCleanup);
>  
> -    ret = qemuMigrationSrcPerformNative(driver, vm, persist_xml, uri, cookiein, cookieinlen,
> -                                        cookieout, cookieoutlen,
> -                                        flags, resource, NULL, graphicsuri,
> -                                        nmigrate_disks, migrate_disks, migParams, nbdURI);
> -
> -    if (ret < 0) {
> -        qemuMigrationSrcRestoreDomainState(driver, vm);
> -        goto endjob;
> -    }
> -
> -    ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_PERFORM3_DONE));
> +    if (qemuMigrationSrcPerformNative(driver, vm, persist_xml, uri, cookiein, cookieinlen,
> +                                      cookieout, cookieoutlen,
> +                                      flags, resource, NULL, graphicsuri,
> +                                      nmigrate_disks, migrate_disks, migParams, nbdURI) < 0)
> +        goto cleanup;
>  
>      if (virCloseCallbacksSet(driver->closeCallbacks, vm, conn,
>                               qemuMigrationSrcCleanup) < 0)
> -        goto endjob;
> +        goto cleanup;

So this failure now becomes an error from previously being technically
ignored, and ...

>  
> - endjob:
> +    ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_PERFORM3_DONE));
> +    ret = 0;
> +
> + cleanup:
>      if (ret < 0 && !virDomainObjIsFailedPostcopy(vm)) {
> +        qemuMigrationSrcRestoreDomainState(driver, vm);

... this call will not be skipped in such case, thus restoring the VM,
but since we fail anyways the migration will be cancelled.

So I think this can be considered a "bugfix" for a extremely
unlikely/impossible bug.

>          qemuMigrationParamsReset(driver, vm, VIR_ASYNC_JOB_MIGRATION_OUT,
>                                   jobPriv->migParams, priv->job.apiFlags);
>          qemuMigrationJobFinish(vm);
> -- 
> 2.35.1
> 

Reviewed-by: Peter Krempa <pkrempa@redhat.com>