[libvirt] [PATCH] qemu_migrate: Fix assign the same port when migrating concurrently
Wangyufei (A)
james.wangyufei at huawei.com
Fri Sep 27 09:36:23 UTC 2013
Yes, I get your point.
this_port = QEMUD_MIGRATION_FIRST_PORT + port++;
if (port == QEMUD_MIGRATION_NUM_PORTS)
port = 0;
the operations above should be atomic, otherwise, port may be bigger than QEMUD_MIGRATION_NUM_PORTS and out of control at last. Right?
Using virPortAllocator is much more complicated, I need to think about it. I guess qemu driver lock removed has sent some devils out, we'll see.
Thanks for your reply.
> -----Original Message-----
> From: jdenemar at redhat.com [mailto:jdenemar at redhat.com]
> Sent: Friday, September 27, 2013 5:06 PM
> To: Wangyufei (A)
> Cc: libvir-list at redhat.com; Michal Privoznik; Wangrui (K)
> Subject: Re: [libvirt] [PATCH] qemu_migrate: Fix assign the same port when
> migrating concurrently
>
> On Fri, Sep 27, 2013 at 06:28:50 +0000, Wangyufei (A) wrote:
> > From: WangYufei <james.wangyufei at huawei.com>
> > 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 <james.wangyufei at huawei.com>
> > ---
> > 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
More information about the libvir-list
mailing list