On Fri, Sep 27, 2013 at 06:28:50 +0000, Wangyufei (A) wrote: > From: WangYufei <[email protected]> > Date: Fri, 27 Sep 2013 11:53:57 +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 change > the port increase to atomic operation to solve the problem.
Oops, this was apparently latent until the big qemu driver lock was removed. > > Signed-off-by: WangYufei <[email protected]> > --- > src/qemu/qemu_migration.c | 5 +++-- > 1 files changed, 3 insertions(+), 2 deletions(-) > > diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c > index 3a1aab7..0f496f4 100644 > --- a/src/qemu/qemu_migration.c > +++ b/src/qemu/qemu_migration.c > @@ -57,6 +57,7 @@ > #include "virhook.h" > #include "virstring.h" > #include "virtypedparam.h" > +#include "viratomic.h" > > #define VIR_FROM_THIS VIR_FROM_QEMU > > @@ -2521,7 +2522,7 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver, > * to be a correct hostname which refers to the target machine). > */ > if (uri_in == NULL) { > - this_port = QEMUD_MIGRATION_FIRST_PORT + port++; > + this_port = QEMUD_MIGRATION_FIRST_PORT + virAtomicIntInc(&port); > if (port == QEMUD_MIGRATION_NUM_PORTS) port = 0; > > /* Get hostname */ > @@ -2578,7 +2579,7 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver, > > if (uri->port == 0) { > /* Generate a port */ > - this_port = QEMUD_MIGRATION_FIRST_PORT + port++; > + this_port = QEMUD_MIGRATION_FIRST_PORT + virAtomicIntInc(&port); > if (port == QEMUD_MIGRATION_NUM_PORTS) > port = 0; > Unfortunately, this patch is incomplete. The increments are now atomic but the wrapping at QEMUD_MIGRATION_NUM_PORTS is not. I think this should use virPortAllocator instead. Jirka -- libvir-list mailing list [email protected] https://www.redhat.com/mailman/listinfo/libvir-list
