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.wangyu...@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

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to