[libvirt] [PATCH] Introduce yet another migration version in API.

Daniel P. Berrange berrange at redhat.com
Tue Nov 9 21:04:07 UTC 2010


On Tue, Nov 09, 2010 at 01:33:50PM -0500, Chris Lalancette wrote:
> On 11/02/10 - 01:08:53PM, Daniel P. Berrange wrote:
> > This patch attempts to introduce a version 3 that uses the
> > improved 5 step sequence
> > 
> >  *  Src: Begin
> >           - Generate XML to pass to dst
> >           - Generate optional cookie to pass to dst
> > 
> >  *  Dst: Prepare
> >           - Get ready to accept incoming VM
> >           - Generate optional cookie to pass to src
> > 
> >  *  Src: Perform
> >           - Start migration and wait for send completion
> >           - Generate optional cookie to pass to dst
> > 
> >  *  Dst: Finish
> >           - Wait for recv completion and check status
> >           - Kill off VM if failed, resume if success
> >           - Generate optional cookie to pass to src
> > 
> >  *  Src: Confirm
> >           - Kill off VM if success, resume if failed
> > 
> > The API is designed to allow both input and output cookies
> > in all methods where applicable. This lets us pass around
> > arbitrary extra driver specific data between src & dst during
> > migration. Combined with the extra 'Begin' method this lets
> > us pass lease information from source to dst at the start of
> > migration
> > 
> > Moving the killing of the source VM out of Perform and
> > into Confirm, means we can now recover if the dst host
> > can't successfully Finish receiving migration data.
> 
> Yeah, this seems like a pretty good sequence.  Like mentioned below, if the
> last step fails, there isn't a whole lot we can do, except make sure to report
> it and let management kill it off.  One comment inline...
> 
> <snip>
> 
> > diff --git a/src/libvirt.c b/src/libvirt.c
> > index e24fb9e..04a7cd0 100644
> > --- a/src/libvirt.c
> > +++ b/src/libvirt.c
> ...
> > +/*
> > + * Sequence v3:
> > + *
> > + *  Src: Begin
> > + *        - Generate XML to pass to dst
> > + *        - Generate optional cookie to pass to dst
> > + *
> > + *  Dst: Prepare
> > + *        - Get ready to accept incoming VM
> > + *        - Generate optional cookie to pass to src
> > + *
> > + *  Src: Perform
> > + *        - Start migration and wait for send completion
> > + *        - Generate optional cookie to pass to dst
> > + *
> > + *  Dst: Finish
> > + *        - Wait for recv completion and check status
> > + *        - Kill off VM if failed, resume if success
> > + *        - Generate optional cookie to pass to src
> > + *
> > + *  Src: Confirm
> > + *        - Kill off VM if success, resume if failed
> > + *
> > + */
> > +static virDomainPtr
> > +virDomainMigrateVersion3 (virDomainPtr domain,
> > +                          virConnectPtr dconn,
> > +                          unsigned long flags,
> > +                          const char *dname,
> > +                          const char *uri,
> > +                          unsigned long bandwidth)
> > +{
> > +    virDomainPtr ddomain = NULL;
> > +    char *uri_out = NULL;
> > +    char *cookiesrc = NULL;
> > +    char *cookiedst = NULL;
> > +    char *dom_xml = NULL;
> > +    int cookiesrclen = 0;
> > +    int cookiedstlen = 0;
> > +    int ret;
> > +    virDomainInfo info;
> > +    virErrorPtr orig_err = NULL;
> > +
> > +    if (!domain->conn->driver->domainMigrateBegin3) {
> > +        virLibConnError (domain->conn, VIR_ERR_INTERNAL_ERROR, __FUNCTION__);
> > +        virDispatchError(domain->conn);
> > +        return NULL;
> > +    }
> > +    dom_xml = domain->conn->driver->domainMigrateBegin3
> > +        (domain->conn, &cookiesrc, &cookiesrclen, uri, flags, dname,
> > +         bandwidth);
> > +    if (!dom_xml)
> > +        goto done;
> > +
> > +    ret = virDomainGetInfo (domain, &info);
> > +    if (ret == 0 && info.state == VIR_DOMAIN_PAUSED) {
> > +        flags |= VIR_MIGRATE_PAUSED;
> > +    }
> > +
> > +    ret = dconn->driver->domainMigratePrepare3
> > +        (dconn, cookiesrc, cookiesrclen, &cookiedst, &cookiedstlen,
> > +         uri, &uri_out, flags, dname, bandwidth, dom_xml);
> > +    VIR_FREE (dom_xml);
> > +    if (ret == -1)
> > +        goto done;
> > +
> > +    if (uri == NULL && uri_out == NULL) {
> > +        virLibConnError (domain->conn, VIR_ERR_INTERNAL_ERROR,
> > +                         _("domainMigratePrepare2 did not set uri"));
> > +        virDispatchError(domain->conn);
> > +        goto done;
> > +    }
> > +    if (uri_out)
> > +        uri = uri_out; /* Did domainMigratePrepare2 change URI? */
> > +    assert (uri != NULL);
> 
> I think we should get rid of this whole "uri_out" concept, while we are
> adding a new protocol.  Basically, it allows the destination to "tell" the
> source where to migrate to, but there is no way to really discover that.  What
> you really need are:
> 
> 1)  The ability to let the user specify which network should be used for
> migration.
> 2)  The ability to determine the "default" network, in the absence of 1).
> 
> We already get 1) from the passed in uri, if it is specified.  We can easily
> figure out 2) from the source, since we know we can reach the destination via
> dconn.  So if nothing is specified for 1), we can just default to the same
> network that the libvirt transport is using.
> 
> This will eliminate a lot of the headaches we have with migration protocol
> version 2 with trying to determine the hostname on the destination side.

While I understand your desire to change this, I think it would be a very
bad idea todo so.  These semantics aren't expressed in the API at all,
and neither the app or the user knows whether libvirt is about to use
version 1, 2 or 3 of the migration protocol.  Thus having the semantics
of the URI change based on version 1, 2 or 3 would be very surprising,
and make it impossible to predict the semantics when invoking the API.

Daniel
-- 
|: Red Hat, Engineering, London    -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :|
|: http://autobuild.org        -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list