[libvirt] [PATCH v2 2/8] qemu: Simplify qemuMigrationFinish

John Ferlan jferlan at redhat.com
Thu Sep 17 21:45:26 UTC 2015



On 09/11/2015 09:26 AM, Jiri Denemark wrote:
> Offline migration migration is quite special because we don't really
> need to do anything but make the domain persistent. Let's do it
> separately from normal migration to avoid cluttering the code with
> !(flags & VIR_MIGRATE_OFFLINE).
> 
> Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
> ---
> 
> Notes:
>     Version 2:
>     - rebased on top of changed patch 1 (context conflict)
> 
>  src/qemu/qemu_migration.c | 72 +++++++++++++++++++++++------------------------
>  1 file changed, 36 insertions(+), 36 deletions(-)
> 
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index b9e0c22..48a4476 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -5660,8 +5660,14 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
>      /* Did the migration go as planned?  If yes, return the domain
>       * object, but if no, clean up the empty qemu process.
>       */
> -    if (retcode == 0) {
> -        if (!virDomainObjIsActive(vm) && !(flags & VIR_MIGRATE_OFFLINE)) {
> +    if (flags & VIR_MIGRATE_OFFLINE) {
> +        if (retcode != 0 ||
> +            qemuMigrationPersist(driver, vm, mig) < 0)
> +            goto endjob;
> +

Should this path also update mig->jobInfo if it exists?  That would have
been done previously

ACK otherwise

John

> +        dom = virGetDomain(dconn, vm->def->name, vm->def->uuid);
> +    } else if (retcode == 0) {
> +        if (!virDomainObjIsActive(vm)) {
>              virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>                             _("guest unexpectedly quit"));
>              qemuMigrationErrorReport(driver, vm->def->name);
> @@ -5678,20 +5684,17 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
>              }
>          }
>  
> -        if (!(flags & VIR_MIGRATE_OFFLINE)) {
> -            if (qemuMigrationVPAssociatePortProfiles(vm->def) < 0) {
> -                qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED,
> -                                VIR_QEMU_PROCESS_STOP_MIGRATED);
> -                virDomainAuditStop(vm, "failed");
> -                event = virDomainEventLifecycleNewFromObj(vm,
> -                                                 VIR_DOMAIN_EVENT_STOPPED,
> -                                                 VIR_DOMAIN_EVENT_STOPPED_FAILED);
> -                goto endjob;
> -            }
> -            if (mig->network)
> -                if (qemuDomainMigrateOPDRelocate(driver, vm, mig) < 0)
> -                    VIR_WARN("unable to provide network data for relocation");
> +        if (qemuMigrationVPAssociatePortProfiles(vm->def) < 0) {
> +            qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED,
> +                            VIR_QEMU_PROCESS_STOP_MIGRATED);
> +            virDomainAuditStop(vm, "failed");
> +            event = virDomainEventLifecycleNewFromObj(vm,
> +                                             VIR_DOMAIN_EVENT_STOPPED,
> +                                             VIR_DOMAIN_EVENT_STOPPED_FAILED);
> +            goto endjob;
>          }
> +        if (mig->network && qemuDomainMigrateOPDRelocate(driver, vm, mig) < 0)
> +            VIR_WARN("unable to provide network data for relocation");
>  
>          if (qemuMigrationStopNBDServer(driver, vm, mig) < 0)
>              goto endjob;
> @@ -5713,17 +5716,15 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
>                   * to restart during confirm() step, so we kill it off now.
>                   */
>                  if (v3proto) {
> -                    if (!(flags & VIR_MIGRATE_OFFLINE)) {
> -                        qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED,
> -                                        VIR_QEMU_PROCESS_STOP_MIGRATED);
> -                        virDomainAuditStop(vm, "failed");
> -                    }
> +                    qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED,
> +                                    VIR_QEMU_PROCESS_STOP_MIGRATED);
> +                    virDomainAuditStop(vm, "failed");
>                  }
>                  goto endjob;
>              }
>          }
>  
> -        if (!(flags & VIR_MIGRATE_PAUSED) && !(flags & VIR_MIGRATE_OFFLINE)) {
> +        if (!(flags & VIR_MIGRATE_PAUSED)) {
>              /* run 'cont' on the destination, which allows migration on qemu
>               * >= 0.10.6 to work properly.  This isn't strictly necessary on
>               * older qemu's, but it also doesn't hurt anything there
> @@ -5765,19 +5766,17 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
>  
>          dom = virGetDomain(dconn, vm->def->name, vm->def->uuid);
>  
> -        if (!(flags & VIR_MIGRATE_OFFLINE)) {
> +        event = virDomainEventLifecycleNewFromObj(vm,
> +                                         VIR_DOMAIN_EVENT_RESUMED,
> +                                         VIR_DOMAIN_EVENT_RESUMED_MIGRATED);
> +        if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED) {
> +            virDomainObjSetState(vm, VIR_DOMAIN_PAUSED,
> +                                 VIR_DOMAIN_PAUSED_USER);
> +            if (event)
> +                qemuDomainEventQueue(driver, event);
>              event = virDomainEventLifecycleNewFromObj(vm,
> -                                             VIR_DOMAIN_EVENT_RESUMED,
> -                                             VIR_DOMAIN_EVENT_RESUMED_MIGRATED);
> -            if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED) {
> -                virDomainObjSetState(vm, VIR_DOMAIN_PAUSED,
> -                                     VIR_DOMAIN_PAUSED_USER);
> -                if (event)
> -                    qemuDomainEventQueue(driver, event);
> -                event = virDomainEventLifecycleNewFromObj(vm,
> -                                                 VIR_DOMAIN_EVENT_SUSPENDED,
> -                                                 VIR_DOMAIN_EVENT_SUSPENDED_PAUSED);
> -            }
> +                                             VIR_DOMAIN_EVENT_SUSPENDED,
> +                                             VIR_DOMAIN_EVENT_SUSPENDED_PAUSED);
>          }
>  
>          if (virDomainObjIsActive(vm) &&
> @@ -5788,7 +5787,7 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
>  
>          /* Guest is successfully running, so cancel previous auto destroy */
>          qemuProcessAutoDestroyRemove(driver, vm);
> -    } else if (!(flags & VIR_MIGRATE_OFFLINE)) {
> +    } else {
>          qemuDomainJobInfo info;
>  
>          /* Check for a possible error on the monitor in case Finish was called
> @@ -5806,11 +5805,12 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
>                                           VIR_DOMAIN_EVENT_STOPPED_FAILED);
>      }
>  
> -    if (qemuMigrationBakeCookie(mig, driver, vm, cookieout, cookieoutlen,
> + endjob:
> +    if (dom &&
> +        qemuMigrationBakeCookie(mig, driver, vm, cookieout, cookieoutlen,
>                                  QEMU_MIGRATION_COOKIE_STATS) < 0)
>          VIR_WARN("Unable to encode migration cookie");
>  
> - endjob:
>      qemuMigrationJobFinish(driver, vm);
>      if (!vm->persistent && !virDomainObjIsActive(vm))
>          qemuDomainRemoveInactive(driver, vm);
> 




More information about the libvir-list mailing list