[libvirt] [PATCH v2 05/12] migration: refactor: merge direct and p2p into unmanaged

John Ferlan jferlan at redhat.com
Wed Sep 16 23:11:12 UTC 2015



On 09/10/2015 09:20 AM, Nikolay Shirokovskiy wrote:
> p2p plain and direct function are good candidates for code reuse. Their main
> function is same - to branch among different versions of migration protocol and
> implementation of this function is also same. Also they have other common
> functionality in lesser aspects. So let's merge them.
> 
> But as they have different signatures we have to get to convention on how to
> pass direct migration 'uri' in 'dconnuri' and 'miguri'. Fortunately we alreay
> have such convention in parameters passed to toURI2 function, just let's follow
> it. 'uri' is passed in miguri and dconnuri is ignored.
> 
> Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>
> ---
>  src/libvirt-domain.c |  140 ++++++++++++++------------------------------------
>  1 files changed, 39 insertions(+), 101 deletions(-)
> 
> diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
> index 15de714..1631944 100644
> --- a/src/libvirt-domain.c
> +++ b/src/libvirt-domain.c
> @@ -3339,21 +3339,23 @@ virDomainMigratePeer2PeerParams(virDomainPtr domain,
>  }
>  
>  static int
> -virDomainMigratePeer2PeerPlain(virDomainPtr domain,
> -                               const char *xmlin,
> -                               unsigned int flags,
> -                               const char *dname,
> -                               const char *dconnuri,
> -                               const char *uri,
> -                               unsigned long long bandwidth)
> +virDomainMigrateUnmanaged(virDomainPtr domain,
> +                          const char *xmlin,
> +                          unsigned int flags,
> +                          const char *dname,
> +                          const char *dconnuri,
> +                          const char *miguri,
> +                          unsigned long long bandwidth)

Perhaps should have just used that "Unmanaged" name all along as this
patch has two things going on - renaming a function and merging another
into it.  Perhaps even with the miguri parameter change too!

I know already present but thumbs down to modules that are felt to be
self commenting - especially the *uri params ;-)

>  {
> +    const char *uri = NULL;
> +
>      VIR_DOMAIN_DEBUG(domain,
> -                     "dconnuri=%s, xmlin=%s, dname=%s, uri=%s, bandwidth=%llu "
> +                     "dconnuri=%s, xmlin=%s, dname=%s, miguri=%s, bandwidth=%llu "
>                       "flags=%x",
> -                     dconnuri, NULLSTR(xmlin), NULLSTR(dname), NULLSTR(uri),
> +                     dconnuri, NULLSTR(xmlin), NULLSTR(dname), NULLSTR(miguri),
>                       bandwidth, flags);
>  
> -    if (virDomainMigrateCheckNotLocal(dconnuri) < 0)
> +    if ((flags & VIR_MIGRATE_PEER2PEER) && virDomainMigrateCheckNotLocal(dconnuri) < 0)

Ahh... now I see... The "flags" check here is for only make this call on
VIR_MIGRATE_PEER2PEER; however, in patch 10, the dconnuri is cleared if
!(flags & VIR_MIGRATE_PEER2PEER) which I'm going to assume confuses
Coverity since flags can be "many" things. I don't have any smart ideas
how to resolve this yet, but at least it's beginning to make sense.

This API assumes only be the Peer2Peer or Direct - Peer2Peer is a
'flags' bit and Direct is a VIR_DRV_FEATURE_MIGRATION_DIRECT driver
feature.  We trust (ahem) our caller to do the right thing and call us
the right way.

>          return -1;
>  
>      if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
> @@ -3365,7 +3367,7 @@ virDomainMigratePeer2PeerPlain(virDomainPtr domain,
>          }
>          return domain->conn->driver->domainMigratePerform3
>                  (domain, xmlin, NULL, 0, NULL, NULL, dconnuri,
> -                 uri, flags, dname, bandwidth);
> +                 miguri, flags, dname, bandwidth);
>      } else {
>          VIR_DEBUG("Using migration protocol 2");
>          if (!domain->conn->driver->domainMigratePerform) {
> @@ -3378,85 +3380,21 @@ virDomainMigratePeer2PeerPlain(virDomainPtr domain,
>                               "migration"));
>              return -1;
>          }
> -        if (uri) {
> -            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                           _("Unable to override peer2peer migration URI"));
> -            return -1;
> +        if (flags & VIR_MIGRATE_PEER2PEER) {
> +            if (miguri) {
> +                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                               _("Unable to override peer2peer migration URI"));
> +                return -1;
> +            }
> +            uri = dconnuri;
> +        } else {
> +            uri = miguri;
>          }
>          return domain->conn->driver->domainMigratePerform
> -                (domain, NULL, 0, dconnuri, flags, dname, bandwidth);
> +                (domain, NULL, 0, uri, flags, dname, bandwidth);
>      }
>  }
>  
> -/*
> - * In normal migration, the libvirt client co-ordinates communication
> - * between the 2 libvirtd instances on source & dest hosts.
> - *
> - * Some hypervisors support an alternative, direct migration where
> - * there is no requirement for a libvirtd instance on the dest host.
> - * In this case
> - *
> - * eg, XenD can talk direct to XenD, so libvirtd on dest does not
> - * need to be involved at all, or even running
> - */

Perhaps this comment can be lifted above and your clairvoyance to know
what was supposed to come after "In this case" can shine through...

And by lifted I mean - let's use it as a basis to comment the Unmanaged
API indicating two (currently) potential uses... If 'flags' has
Peer2Peer, then dconnuri must be set; otherwise, for direct there is no
dconnuri... etc.. Take what you've learned and leave a few bread crumbs
for those that follow you down this rabbit hole! (Although there are
others that perhaps disagree with "over commenting").

In any case - beyond the couple of nits, it seems from my reading this
was a good merge of two functions.

John

FYI: I have to stop for the evening - I smell dinner cooking... I'll
pick this back up tomorrow

> -static int
> -virDomainMigrateDirect(virDomainPtr domain,
> -                       const char *xmlin,
> -                       unsigned long flags,
> -                       const char *dname,
> -                       const char *uri,
> -                       unsigned long bandwidth)
> -{
> -    VIR_DOMAIN_DEBUG(domain,
> -                     "xmlin=%s, flags=%lx, dname=%s, uri=%s, bandwidth=%lu",
> -                     NULLSTR(xmlin), flags, NULLSTR(dname), NULLSTR(uri),
> -                     bandwidth);
> -
> -    /* Perform the migration.  The driver isn't supposed to return
> -     * until the migration is complete.
> -     */
> -    if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
> -                                 VIR_DRV_FEATURE_MIGRATION_V3)) {
> -        if (!domain->conn->driver->domainMigratePerform3) {
> -            virReportUnsupportedError();
> -            return -1;
> -        }
> -        VIR_DEBUG("Using migration protocol 3");
> -        /* dconn URI not relevant in direct migration, since no
> -         * target libvirtd is involved */
> -        return domain->conn->driver->domainMigratePerform3(domain,
> -                                                           xmlin,
> -                                                           NULL, /* cookiein */
> -                                                           0,    /* cookieinlen */
> -                                                           NULL, /* cookieoutlen */
> -                                                           NULL, /* cookieoutlen */
> -                                                           NULL, /* dconnuri */
> -                                                           uri,
> -                                                           flags,
> -                                                           dname,
> -                                                           bandwidth);
> -    } else {
> -        if (!domain->conn->driver->domainMigratePerform) {
> -            virReportUnsupportedError();
> -            return -1;
> -        }
> -        VIR_DEBUG("Using migration protocol 2");
> -        if (xmlin) {
> -            virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> -                           _("Unable to change target guest XML during migration"));
> -            return -1;
> -        }
> -        return domain->conn->driver->domainMigratePerform(domain,
> -                                                          NULL, /* cookie */
> -                                                          0,    /* cookielen */
> -                                                          uri,
> -                                                          flags,
> -                                                          dname,
> -                                                          bandwidth);
> -    }
> -}
> -
> -
>  /**
>   * virDomainMigrate:
>   * @domain: a domain object
> @@ -3594,8 +3532,8 @@ virDomainMigrate(virDomainPtr domain,
>              }
>  
>              VIR_DEBUG("Using peer2peer migration");
> -            if (virDomainMigratePeer2PeerPlain(domain, NULL, flags, dname,
> -                                               uri ? uri : dstURI, NULL, bandwidth) < 0) {
> +            if (virDomainMigrateUnmanaged(domain, NULL, flags, dname,
> +                                          uri ? uri : dstURI, NULL, bandwidth) < 0) {
>                  VIR_FREE(dstURI);
>                  goto error;
>              }
> @@ -3815,8 +3753,8 @@ virDomainMigrate2(virDomainPtr domain,
>                  return NULL;
>  
>              VIR_DEBUG("Using peer2peer migration");
> -            if (virDomainMigratePeer2PeerPlain(domain, dxml, flags, dname,
> -                                               dstURI, uri, bandwidth) < 0) {
> +            if (virDomainMigrateUnmanaged(domain, dxml, flags, dname,
> +                                          dstURI, uri, bandwidth) < 0) {
>                  VIR_FREE(dstURI);
>                  goto error;
>              }
> @@ -4196,8 +4134,8 @@ virDomainMigrateToURI(virDomainPtr domain,
>          if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
>                                       VIR_DRV_FEATURE_MIGRATION_P2P)) {
>              VIR_DEBUG("Using peer2peer migration");
> -            if (virDomainMigratePeer2PeerPlain(domain, NULL, flags,
> -                                               dname, duri, NULL, bandwidth) < 0)
> +            if (virDomainMigrateUnmanaged(domain, NULL, flags,
> +                                          dname, duri, NULL, bandwidth) < 0)
>                  goto error;
>          } else {
>              /* No peer to peer migration supported */
> @@ -4208,8 +4146,8 @@ virDomainMigrateToURI(virDomainPtr domain,
>          if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
>                                       VIR_DRV_FEATURE_MIGRATION_DIRECT)) {
>              VIR_DEBUG("Using direct migration");
> -            if (virDomainMigrateDirect(domain, NULL, flags,
> -                                       dname, duri, bandwidth) < 0)
> +            if (virDomainMigrateUnmanaged(domain, NULL, flags,
> +                                       dname, NULL, duri, bandwidth) < 0)
>                  goto error;
>          } else {
>              /* Cannot do a migration with only the perform step */
> @@ -4342,8 +4280,8 @@ virDomainMigrateToURI2(virDomainPtr domain,
>          if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
>                                       VIR_DRV_FEATURE_MIGRATION_P2P)) {
>              VIR_DEBUG("Using peer2peer migration");
> -            if (virDomainMigratePeer2PeerPlain(domain, dxml, flags,
> -                                               dname, dconnuri, miguri, bandwidth) < 0)
> +            if (virDomainMigrateUnmanaged(domain, dxml, flags,
> +                                          dname, dconnuri, miguri, bandwidth) < 0)
>                  goto error;
>          } else {
>              /* No peer to peer migration supported */
> @@ -4354,8 +4292,8 @@ virDomainMigrateToURI2(virDomainPtr domain,
>          if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
>                                       VIR_DRV_FEATURE_MIGRATION_DIRECT)) {
>              VIR_DEBUG("Using direct migration");
> -            if (virDomainMigrateDirect(domain, dxml, flags,
> -                                       dname, miguri, bandwidth) < 0)
> +            if (virDomainMigrateUnmanaged(domain, dxml, flags,
> +                                       dname, NULL, miguri, bandwidth) < 0)
>                  goto error;
>          } else {
>              /* Cannot do a migration with only the perform step */
> @@ -4473,8 +4411,8 @@ virDomainMigrateToURI3(virDomainPtr domain,
>                  goto error;
>          } else if (compat) {
>              VIR_DEBUG("Using peer2peer migration");
> -            if (virDomainMigratePeer2PeerPlain(domain, dxml, flags, dname,
> -                                               dconnuri, uri, bandwidth) < 0)
> +            if (virDomainMigrateUnmanaged(domain, dxml, flags, dname,
> +                                          dconnuri, uri, bandwidth) < 0)
>                  goto error;
>          } else {
>              virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> @@ -4501,8 +4439,8 @@ virDomainMigrateToURI3(virDomainPtr domain,
>          }
>  
>          VIR_DEBUG("Using direct migration");
> -        if (virDomainMigrateDirect(domain, dxml, flags,
> -                                   dname, uri, bandwidth) < 0)
> +        if (virDomainMigrateUnmanaged(domain, dxml, flags,
> +                                   dname, NULL, uri, bandwidth) < 0)
>              goto error;
>      }
>  
> 




More information about the libvir-list mailing list