[libvirt] [PATCH] qemu_migrate: Fix assign the same port when migrating concurrently

jdenemar at redhat.com jdenemar at redhat.com
Mon Sep 30 12:33:32 UTC 2013


On Mon, Sep 30, 2013 at 03:55:21 +0000, Wangyufei (A) wrote:
> From 6c2de34432db674072231ad66c9e8a0a600ede8a Mon Sep 17 00:00:00 2001
> From: WangYufei <james.wangyufei at huawei.com>
> Date: Mon, 30 Sep 2013 11:48:43 +0800
> Subject: [PATCH] qemu_migrate: Fix assign the same port when migrating concurrently
> 
> When we migrate vms concurrently, there's a chance that libvirtd on destination assign the same port for different migrations, which will lead to migration failed during migration prepare phase on destination. So we use virPortAllocator here to solve the problem.
> 
...
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index e8bc04d..9437b5a 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -688,6 +688,11 @@ qemuStateInitialize(bool privileged,
>                               cfg->webSocketPortMax)) == NULL)
>          goto error;
> 
> +    if ((qemu_driver->migrationPorts =
> +        virPortAllocatorNew(QEMU_MIGRATION_PORT_MIN,
> +                            QEMU_MIGRATION_PORT_MAX)) == NULL)
> +        goto error;
> +

Hmm, I guess we could make the port range configurable, but that's a
separate thing.

>      if (qemuSecurityInit(qemu_driver) < 0)
>          goto error;
> 
> @@ -994,6 +999,7 @@ qemuStateCleanup(void) {
>      virObjectUnref(qemu_driver->domains);
>      virObjectUnref(qemu_driver->remotePorts);
>      virObjectUnref(qemu_driver->webSocketPorts);
> +    virObjectUnref(qemu_driver->migrationPorts);
> 
>      virObjectUnref(qemu_driver->xmlopt);
> 
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index 3a1aab7..82d90bf 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
...
> @@ -2600,8 +2600,11 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
>  cleanup:
>      virURIFree(uri);
>      VIR_FREE(hostname);
> -    if (ret != 0)
> +    if (ret != 0) {
>          VIR_FREE(*uri_out);
> +        virPortAllocatorRelease(driver->migrationPorts,
> +                                (unsigned short)this_port);
> +    }
>      return ret;
>  }

I'm afraid we will also need to release the port once the migration is
done. qemuMigrationPrepareCleanup and qemuMigrationFinish are the places
where we should handle this.

Jirka




More information about the libvir-list mailing list