[libvirt] [PATCH] qemu: Make migration fail when port profile association fails on the dst host

Laine Stump laine at laine.org
Tue Mar 27 18:32:24 UTC 2012


This looks like a useful bug to fix before 0.9.11 if possible, but your
patch showed up corrupt (long lines are broken for starters, possibly
other things) so "git am" fails to apply it. Can you re-send using "git
send-email" (or if that doesn't work for you, git format-patch, then
send the patch as an attachment rather than just pasting it inline).


On 03/26/2012 07:53 PM, Christian Benvenuti (benve) wrote:
> In the current V3 migration protocol, Libvirt does not
> check the result of the function
>
>   qemuMigrationVPAssociatePortProfiles
>
> This means that it is possible for a migration to complete
> successfully even when the VM loses network connectivity on
> the destination host.
>
> With this change libvirt aborts the migration
> (during the "finish" step) when the above function fails, that
> is to say when at least one of the port profile associations fails.
>
> Signed-off by: Christian Benvenuti <benve at cisco.com>
>
> ---
>  src/qemu/qemu_migration.c |   24 ++++++++++++++++++++----
>  1 files changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index 802785f..38fbf83 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -2716,7 +2716,7 @@ qemuMigrationPerform(struct qemud_driver *driver,
>      }
>  }
>  
> -static void
> +static int
>  qemuMigrationVPAssociatePortProfiles(virDomainDefPtr def) {
>      int i;
>      int last_good_net = -1;
> @@ -2731,13 +2731,17 @@
> qemuMigrationVPAssociatePortProfiles(virDomainDefPtr def) {
>  
> virDomainNetGetActualDirectDev(net),
>                                                 -1,
>                                                 def->uuid,
> -
> VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_FINISH, false) < 0)
> +
> VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_FINISH,
> +                                               false) < 0) {
> +                VIR_ERROR("Port profile Associate failed for %s",
> net->ifname);
>                  goto err_exit;
> +            }
> +            VIR_DEBUG("Port profile Associate succeeded for %s",
> net->ifname);
>          }
>          last_good_net = i;
>      }
>  
> -    return;
> +    return 0;
>  
>  err_exit:
>      for (i = 0; i < last_good_net; i++) {
> @@ -2751,6 +2755,7 @@ err_exit:
>  
> VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_FINISH));
>          }
>      }
> +    return -1;
>  }
>  
>  
> @@ -2805,7 +2810,18 @@ qemuMigrationFinish(struct qemud_driver *driver,
>              goto endjob;
>          }
>  
> -        qemuMigrationVPAssociatePortProfiles(vm->def);
> +        if (qemuMigrationVPAssociatePortProfiles(vm->def) < 0) {
> +            qemuProcessStop(driver, vm, 1, VIR_DOMAIN_SHUTOFF_FAILED);
> +            virDomainAuditStop(vm, "failed");
> +            event = virDomainEventNewFromObj(vm,
> +                                             VIR_DOMAIN_EVENT_STOPPED,
> +
> VIR_DOMAIN_EVENT_STOPPED_FAILED);
> +            goto endjob;
> +        }
>  
>          if (flags & VIR_MIGRATE_PERSIST_DEST) {
>              virDomainDefPtr vmdef;




More information about the libvir-list mailing list