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

Eric Blake eblake at redhat.com
Wed May 11 23:13:31 UTC 2011


On 05/11/2011 03:09 AM, Daniel P. Berrange wrote:
> Migration just seems togo from bad to worse. We already had to

s/togo/to go/

> introduce a second migration protocol when adding the QEMU driver,
> since the one from Xen was insufficiently flexible to cope with
> passing the data the QEMU driver required.
> 
> @@ -643,6 +712,12 @@ struct _virDriver {
>      virDrvQemuDomainMonitorCommand qemuDomainMonitorCommand;
>      virDrvDomainOpenConsole domainOpenConsole;
>      virDrvDomainInjectNMI domainInjectNMI;
> +    virDrvDomainMigrateBegin3	domainMigrateBegin3;
> +    virDrvDomainMigratePrepare3	domainMigratePrepare3;
> +    virDrvDomainMigratePrepareTunnel3	domainMigratePrepareTunnel3;
> +    virDrvDomainMigratePerform3	domainMigratePerform3;
> +    virDrvDomainMigrateFinish3	domainMigrateFinish3;
> +    virDrvDomainMigrateConfirm3	domainMigrateConfirm3;

Should we group these callbacks next door to their version2 counterparts
to make it easier to find all the migration callbacks next to one
another?  Up to you; I didn't do it below...

> @@ -3691,6 +3898,7 @@ virDomainMigrate (virDomainPtr domain,
>                      return NULL;
>              }
>  
> +            VIR_DEBUG0("Using peer2peer migration");

Recent patch flurry means this won't compile.  Isn't rebasing fun? :)

> +int
> +virDomainMigratePerform3(virDomainPtr domain,
> +                         const char *cookiein,
> +                         int cookieinlen,
> +                         char **cookieout,
> +                         int *cookieoutlen,
> +                         const char *uri,
> +                         unsigned long flags,
> +                         const char *dname,
> +                         unsigned long bandwidth)
> +{
> +    virConnectPtr conn;
> +
> +    VIR_DOMAIN_DEBUG(domain, "cookiein=%p, cookieinlen=%d, cookieout=%p, cookieoutlen=%p,"
> +                     "uri=%s, flags=%lu, dname=%s, bandwidth=%lu",
> +                     cookiein, cookieinlen, cookieout, cookieoutlen,
> +                     uri, flags, NULLSTR(dname), bandwidth);

Oh my; 10 arguments.  You broke my < 10-argument assumption in one blow :)

> +
> +    virResetLastError();
> +
> +    if (!VIR_IS_CONNECT (dconn)) {

Still some spaces before ( if you want to clean that up.

ACK with this squashed in:

diff --git i/src/libvirt.c w/src/libvirt.c
index ec888b2..aa72fb3 100644
--- i/src/libvirt.c
+++ w/src/libvirt.c
@@ -312,15 +312,17 @@ static struct gcry_thread_cbs virTLSThreadImpl = {
 };

 /* Helper macros to implement VIR_DOMAIN_DEBUG using just C99.  This
- * assumes you pass fewer than 10 arguments to VIR_DOMAIN_DEBUG, but
+ * assumes you pass fewer than 15 arguments to VIR_DOMAIN_DEBUG, but
  * can easily be expanded if needed.
  *
  * Note that gcc provides extensions of "define a(b...) b" or
  * "define a(b,...) b,##__VA_ARGS__" as a means of eliding a comma
  * when no var-args are present, but we don't want to require gcc.
  */
-#define VIR_ARG10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, ...) _10
-#define VIR_HAS_COMMA(...) VIR_ARG10(__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1,
1, 0)
+#define VIR_ARG15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \
+                  _11, _12, _13, _14, _15, ...) _15
+#define VIR_HAS_COMMA(...) \
+    VIR_ARG15(__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0)

 /* Form the name VIR_DOMAIN_DEBUG_[01], then call that macro,
  * according to how many arguments are present.  Two-phase due to
@@ -3439,7 +3441,7 @@ virDomainMigrateVersion1 (virDomainPtr domain,
         ddomain = dconn->driver->domainMigrateFinish
             (dconn, dname, cookie, cookielen, uri, flags);
     else
-        ddomain = virDomainLookupByName (dconn, dname);
+        ddomain = virDomainLookupByName(dconn, dname);

  done:
     VIR_FREE (uri_out);
@@ -3930,14 +3932,14 @@ virDomainMigrate (virDomainPtr domain,
                     return NULL;
             }

-            VIR_DEBUG0("Using peer2peer migration");
+            VIR_DEBUG("Using peer2peer migration");
             if (virDomainMigratePeer2Peer(domain, flags, dname, uri ?
uri : dstURI, bandwidth) < 0) {
                 VIR_FREE(dstURI);
                 goto error;
             }
             VIR_FREE(dstURI);

-            ddomain = virDomainLookupByName (dconn, dname ? dname :
domain->name);
+            ddomain = virDomainLookupByName(dconn, dname ? dname :
domain->name);
         } else {
             /* This driver does not support peer to peer migration */
             virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
@@ -3955,19 +3957,19 @@ virDomainMigrate (virDomainPtr domain,
                                      VIR_DRV_FEATURE_MIGRATION_V3) &&
             VIR_DRV_SUPPORTS_FEATURE(dconn->driver, dconn,
                                      VIR_DRV_FEATURE_MIGRATION_V3)) {
-            VIR_DEBUG0("Using migration protocol 3");
+            VIR_DEBUG("Using migration protocol 3");
             ddomain = virDomainMigrateVersion3(domain, dconn, flags,
dname, uri, bandwidth);
         } else if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver,
domain->conn,

VIR_DRV_FEATURE_MIGRATION_V2) &&
                    VIR_DRV_SUPPORTS_FEATURE(dconn->driver, dconn,
                                           VIR_DRV_FEATURE_MIGRATION_V2)) {
-            VIR_DEBUG0("Using migration protocol 2");
+            VIR_DEBUG("Using migration protocol 2");
             ddomain = virDomainMigrateVersion2(domain, dconn, flags,
dname, uri, bandwidth);
         } else if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver,
domain->conn,

VIR_DRV_FEATURE_MIGRATION_V1) &&
                    VIR_DRV_SUPPORTS_FEATURE(dconn->driver, dconn,

VIR_DRV_FEATURE_MIGRATION_V1)) {
-            VIR_DEBUG0("Using migration protocol 1");
+            VIR_DEBUG("Using migration protocol 1");
             ddomain = virDomainMigrateVersion1(domain, dconn, flags,
dname, uri, bandwidth);
         } else {
             /* This driver does not support any migration method */
@@ -4122,7 +4124,7 @@ virDomainMigratePrepare (virConnectPtr dconn,

     virResetLastError();

-    if (!VIR_IS_CONNECT (dconn)) {
+    if (!VIR_IS_CONNECT(dconn)) {
         virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
         virDispatchError(NULL);
         return -1;
@@ -4135,9 +4137,9 @@ virDomainMigratePrepare (virConnectPtr dconn,

     if (dconn->driver->domainMigratePrepare) {
         int ret;
-        ret = dconn->driver->domainMigratePrepare (dconn, cookie,
cookielen,
-                                                   uri_in, uri_out,
-                                                   flags, dname,
bandwidth);
+        ret = dconn->driver->domainMigratePrepare(dconn, cookie, cookielen,
+                                                  uri_in, uri_out,
+                                                  flags, dname, bandwidth);
         if (ret < 0)
             goto error;
         return ret;
@@ -4218,7 +4220,7 @@ virDomainMigrateFinish (virConnectPtr dconn,

     virResetLastError();

-    if (!VIR_IS_CONNECT (dconn)) {
+    if (!VIR_IS_CONNECT(dconn)) {
         virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
         virDispatchError(NULL);
         return NULL;
@@ -4231,9 +4233,9 @@ virDomainMigrateFinish (virConnectPtr dconn,

     if (dconn->driver->domainMigrateFinish) {
         virDomainPtr ret;
-        ret = dconn->driver->domainMigrateFinish (dconn, dname,
-                                                  cookie, cookielen,
-                                                  uri, flags);
+        ret = dconn->driver->domainMigrateFinish(dconn, dname,
+                                                 cookie, cookielen,
+                                                 uri, flags);
         if (!ret)
             goto error;
         return ret;
@@ -4269,7 +4271,7 @@ virDomainMigratePrepare2 (virConnectPtr dconn,

     virResetLastError();

-    if (!VIR_IS_CONNECT (dconn)) {
+    if (!VIR_IS_CONNECT(dconn)) {
         virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
         virDispatchError(NULL);
         return -1;
@@ -4282,10 +4284,10 @@ virDomainMigratePrepare2 (virConnectPtr dconn,

     if (dconn->driver->domainMigratePrepare2) {
         int ret;
-        ret = dconn->driver->domainMigratePrepare2 (dconn, cookie,
cookielen,
-                                                    uri_in, uri_out,
-                                                    flags, dname,
bandwidth,
-                                                    dom_xml);
+        ret = dconn->driver->domainMigratePrepare2(dconn, cookie,
cookielen,
+                                                   uri_in, uri_out,
+                                                   flags, dname, bandwidth,
+                                                   dom_xml);
         if (ret < 0)
             goto error;
         return ret;
@@ -4317,7 +4319,7 @@ virDomainMigrateFinish2 (virConnectPtr dconn,

     virResetLastError();

-    if (!VIR_IS_CONNECT (dconn)) {
+    if (!VIR_IS_CONNECT(dconn)) {
         virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
         virDispatchError(NULL);
         return NULL;
@@ -4330,10 +4332,10 @@ virDomainMigrateFinish2 (virConnectPtr dconn,

     if (dconn->driver->domainMigrateFinish2) {
         virDomainPtr ret;
-        ret = dconn->driver->domainMigrateFinish2 (dconn, dname,
-                                                   cookie, cookielen,
-                                                   uri, flags,
-                                                   retcode);
+        ret = dconn->driver->domainMigrateFinish2(dconn, dname,
+                                                  cookie, cookielen,
+                                                  uri, flags,
+                                                  retcode);
         if (!ret)
             goto error;
         return ret;
@@ -4474,7 +4476,7 @@ virDomainMigratePrepare3(virConnectPtr dconn,

     virResetLastError();

-    if (!VIR_IS_CONNECT (dconn)) {
+    if (!VIR_IS_CONNECT(dconn)) {
         virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
         virDispatchError(NULL);
         return -1;
@@ -4643,7 +4645,7 @@ virDomainMigrateFinish3(virConnectPtr dconn,

     virResetLastError();

-    if (!VIR_IS_CONNECT (dconn)) {
+    if (!VIR_IS_CONNECT(dconn)) {
         virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
         virDispatchError(NULL);
         return -1;

-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20110511/86d03fe3/attachment-0001.sig>


More information about the libvir-list mailing list