[libvirt] [PATCH 2/2] check whether the vm is paused before setting it offline

Daniel P. Berrange berrange at redhat.com
Fri May 20 11:31:57 UTC 2011


On Fri, May 20, 2011 at 07:00:54PM +0800, Wen Congyang wrote:
> At 05/20/2011 04:34 PM, Daniel P. Berrange Write:
> > On Fri, May 20, 2011 at 03:09:42PM +0800, Wen Congyang wrote:
> >> If we do not performe a live migration, the vm is always paused when we go to
> >> doPeer2PeerMigrate2() and doPeer2PeerMigrate3(), because we stop the vm in
> >> qemuMigrationPerform(). So we should check it before setting it offline.
> > 
> > The only code which checks for 'if (flags & VIR_MIGRATE_PAUSED)'
> > is the qemuMigrateFinished method. This is called from
> > doPeer2PeerMigrate2 or doPeer2PeerMigrate3.  So putting the
> > change 'flags |= VIR_MIGRATED_PAUSED' does not make any
> > difference to peer2peer migration, and for non-peer2peer
> > migration, this will have already been set in libvirt.c.
> > 
> > So I'm not seeing what bug is being fixed by this change.
> 
> Without this patch, vm is still paused after migration when
> we do p2p migration.
> 
> The vm should be paused only when:
> 1. the vm is paused before migration
> 2. we use the option --suspend.
> 
> We decide whether to restart the vm on the dest host accoring to whether
> VIR_MIGRATED_PAUSED is set.
> 
> If we do not use the option --live and --suspend, and the vm is running
> before migration, the vm should be also running after migration. But
> the vm will be set offline in the function qemuMigrationPerform().
> When we goto to doPeer2PeerMigrate2() or doPeer2PeerMigrate3(),
> the vm is paused and VIR_MIGRATED_PAUSED is set. So the vm is not
> restarted in the function qemuMigrateFinished().

Ahh, you're not using  --live. That will be why I didn't see this
problem.

> The way to solute this bug is that: we should check the origin status of vm
> before setting it offline. This patch does this.

The key fact is that the place which sets VIR_MIGRATE_PAUSED
must come before the call to qemuMigrationSetOffline. Your
patch fixes it by moving the check to VIR_MIGRATE_PAUSED.

I think the better thing is to move the qemuMigrationSetOffline
call down a level - to the same bits of code which call
qemuMigrationSetSpeed. I'll post a patch for this later.

> 
> > The doPeer2PeerMigrate2 and doPeer2PeerMigrate3 methods
> > are intended to be structured (near) identically to the
> > virDomainMigrate2 and virDomainMigrate3 methods in libvirt.c,
> > so I think the code is correct as it already is.
> > 
> >>
> >> ---
> >>  src/qemu/qemu_migration.c |    9 +++------
> >>  1 files changed, 3 insertions(+), 6 deletions(-)
> >>
> >> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> >> index ab28416..30167f2 100644
> >> --- a/src/qemu/qemu_migration.c
> >> +++ b/src/qemu/qemu_migration.c
> >> @@ -1614,9 +1614,6 @@ static int doPeer2PeerMigrate2(struct qemud_driver *driver,
> >>                                          VIR_DOMAIN_XML_UPDATE_CPU)))
> >>          return -1;
> >>  
> >> -    if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED)
> >> -        flags |= VIR_MIGRATE_PAUSED;
> >> -
> >>      VIR_DEBUG("Prepare2 %p", dconn);
> >>      if (flags & VIR_MIGRATE_TUNNELLED) {
> >>          /*
> >> @@ -1748,9 +1745,6 @@ static int doPeer2PeerMigrate3(struct qemud_driver *driver,
> >>      if (!dom_xml)
> >>          goto cleanup;
> >>  
> >> -    if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED)
> >> -        flags |= VIR_MIGRATE_PAUSED;
> >> -
> >>      VIR_DEBUG("Prepare3 %p", dconn);
> >>      cookiein = cookieout;
> >>      cookieinlen = cookieoutlen;
> >> @@ -1985,6 +1979,9 @@ int qemuMigrationPerform(struct qemud_driver *driver,
> >>      memset(&priv->jobInfo, 0, sizeof(priv->jobInfo));
> >>      priv->jobInfo.type = VIR_DOMAIN_JOB_UNBOUNDED;
> >>  
> >> +    if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED)
> >> +        flags |= VIR_MIGRATE_PAUSED;
> >> +
> >>      resume = virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING;
> >>      if (!(flags & VIR_MIGRATE_LIVE) &&
> >>          virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
> > 
> > 

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list