[libvirt] [PATCH v2 3/3] retrieve paused/running state at the beginning of migration

Paolo Bonzini pbonzini at redhat.com
Wed Dec 9 13:38:28 UTC 2009


This patch fixes the bug where paused/running state is not
transmitted during migration.  As a result, in the QEMU driver
for example the machine was always started on the destination
end.

In order to do so, I just read the state and if it is appropriate
I set the VIR_MIGRATE_PAUSED flag.

* src/libvirt.c (virDomainMigrateVersion1, virDomainMigrateVersion2):
Automatically add VIR_MIGRATE_PAUSED when appropriate.
* src/xen/xend_internal.c (xenDaemonDomainMigratePerform): Give a nicer
error message when migration of paused domains is attempted.
---
 src/libvirt.c           |   14 +++++++++++++-
 src/xen/xend_internal.c |    9 +++++++++
 2 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/src/libvirt.c b/src/libvirt.c
index 2ced604..008e322 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -2963,7 +2963,13 @@ virDomainMigrateVersion1 (virDomainPtr domain,
     virDomainPtr ddomain = NULL;
     char *uri_out = NULL;
     char *cookie = NULL;
-    int cookielen = 0;
+    int cookielen = 0, ret;
+    virDomainInfo info;
+
+    ret = virDomainGetInfo (domain, &info);
+    if (ret == 0 && info.state == VIR_DOMAIN_PAUSED) {
+        flags |= VIR_MIGRATE_PAUSED;
+    }
 
     /* Prepare the migration.
      *
@@ -3028,6 +3034,7 @@ virDomainMigrateVersion2 (virDomainPtr domain,
     char *cookie = NULL;
     char *dom_xml = NULL;
     int cookielen = 0, ret;
+    virDomainInfo info;
 
     /* Prepare the migration.
      *
@@ -3054,6 +3061,11 @@ virDomainMigrateVersion2 (virDomainPtr domain,
     if (!dom_xml)
         return NULL;
 
+    ret = virDomainGetInfo (domain, &info);
+    if (ret == 0 && info.state == VIR_DOMAIN_PAUSED) {
+        flags |= VIR_MIGRATE_PAUSED;
+    }
+
     ret = dconn->driver->domainMigratePrepare2
         (dconn, &cookie, &cookielen, uri, &uri_out, flags, dname,
          bandwidth, dom_xml);
diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
index 8822f44..aa1c07d 100644
--- a/src/xen/xend_internal.c
+++ b/src/xen/xend_internal.c
@@ -4440,6 +4440,15 @@ xenDaemonDomainMigratePerform (virDomainPtr domain,
     if (flags & VIR_MIGRATE_PERSIST_DEST)
         flags &= ~VIR_MIGRATE_PERSIST_DEST;
 
+    /* This is buggy in Xend, but could be supported in principle.  Give
+     * a nice error message.
+     */
+    if (flags & VIR_MIGRATE_PAUSED) {
+        virXendError (conn, VIR_ERR_NO_SUPPORT,
+                      "%s", _("xenDaemonDomainMigrate: xend cannot migrate paused domains"));
+        return -1;
+    }
+
     /* XXX we could easily do tunnelled & peer2peer migration too
        if we want to. support these... */
     if (flags != 0) {
-- 
1.6.5.2




More information about the libvir-list mailing list