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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>
> 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@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]