[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH] migration: offline / inactive domain support



Supports migrating a domain that is currently inactive. This patchset
adds a new migration flag called VIR_MIGRATE_OFFLINE, which can only be
used on domains that are inactive. Offline migration does not support
copying non-shared storage in any case.
---
 src/qemu/qemu_driver.c    |   29 ++++++++++++++++-------------
 src/qemu/qemu_migration.c |    5 ++++-
 tools/virsh-domain.c      |    9 ++++++---
 3 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 6e3747f..f53bf3d 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -9624,34 +9624,37 @@ qemuDomainMigrateBegin3(virDomainPtr domain,
         asyncJob = QEMU_ASYNC_JOB_NONE;
     }
 
+    /* Domain is not active */
     if (!virDomainObjIsActive(vm)) {
+        /* Domain is not active and offline migration requested */
         if (flags & VIR_MIGRATE_OFFLINE) {
-            if (flags & (VIR_MIGRATE_NON_SHARED_DISK|
+            if (flags & (VIR_MIGRATE_NON_SHARED_DISK |
                          VIR_MIGRATE_NON_SHARED_INC)) {
-                virReportError(VIR_ERR_OPERATION_INVALID,
-                               "%s", _("migrating storage handled by volume APIs"));
+                virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                               _("offline migration cannot copy non-shared storage"));
                 goto endjob;
             }
             if (!(flags & VIR_MIGRATE_PERSIST_DEST)) {
-                virReportError(VIR_ERR_OPERATION_INVALID,
-                               "%s", _("VIR_MIGRATE_OFFLINE should combined with VIR_MIGRATE_PERSIST_DEST"));
+                virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                               _("offline migration must be specified with the persistent flag set"));
                 goto endjob;
             }
-            goto offline;
+        } else {
+        /* Domain is not active and NO offline migration */
+            virReportError(VIR_ERR_OPERATION_INVALID,
+                    "%s", _("domain is not running"));
+            goto endjob;
         }
-        virReportError(VIR_ERR_OPERATION_INVALID,
-                       "%s", _("domain is not running"));
-        goto endjob;
     }
 
     /* Check if there is any ejected media.
      * We don't want to require them on the destination.
      */
+    if (virDomainObjIsActive(vm)) {
+        if (qemuDomainCheckEjectableMedia(driver, vm, asyncJob) < 0)
+            goto endjob;
+    }
 
-    if (qemuDomainCheckEjectableMedia(driver, vm, asyncJob) < 0)
-        goto endjob;
-
-offline:
     if (!(xml = qemuMigrationBegin(driver, vm, xmlin, dname,
                                    cookieout, cookieoutlen,
                                    flags)))
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index de9d55d..54e94a4 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1904,8 +1904,10 @@ qemuMigrationRun(struct qemud_driver *driver,
                        virLockManagerPluginGetName(driver->lockManager));
         return -1;
     }
+
     if (flags & VIR_MIGRATE_OFFLINE)
         return 0;
+
     if (!(mig = qemuMigrationEatCookie(driver, vm, cookiein, cookieinlen,
                                        QEMU_MIGRATION_COOKIE_GRAPHICS)))
         goto cleanup;
@@ -3008,7 +3010,7 @@ qemuMigrationFinish(struct qemud_driver *driver,
             goto endjob;
         }
 
-    offline:
+offline:
         if (flags & VIR_MIGRATE_PERSIST_DEST) {
             virDomainDefPtr vmdef;
             if (vm->persistent)
@@ -3176,6 +3178,7 @@ int qemuMigrationConfirm(struct qemud_driver *driver,
 
     if (!(mig = qemuMigrationEatCookie(driver, vm, cookiein, cookieinlen, 0)))
         return -1;
+
     if (flags & VIR_MIGRATE_OFFLINE)
         goto offline;
 
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 4d5a242..8196ba6 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -6644,6 +6644,7 @@ static const vshCmdInfo info_migrate[] = {
 
 static const vshCmdOptDef opts_migrate[] = {
     {"live", VSH_OT_BOOL, 0, N_("live migration")},
+    {"offline", VSH_OT_BOOL, 0, N_("offline (inactive domain) migration")},
     {"p2p", VSH_OT_BOOL, 0, N_("peer-2-peer migration")},
     {"direct", VSH_OT_BOOL, 0, N_("direct migration")},
     {"tunneled", VSH_OT_ALIAS, 0, "tunnelled"},
@@ -6663,7 +6664,6 @@ static const vshCmdOptDef opts_migrate[] = {
     {"dname", VSH_OT_DATA, 0, N_("rename to new name during migration (if supported)")},
     {"timeout", VSH_OT_INT, 0, N_("force guest to suspend if live migration exceeds timeout (in seconds)")},
     {"xml", VSH_OT_STRING, 0, N_("filename containing updated XML for the target")},
-    {"offline", VSH_OT_BOOL, 0, N_("for offline migration")},
     {NULL, 0, 0, NULL}
 };
 
@@ -6730,9 +6730,12 @@ doMigrate(void *opaque)
     if (vshCommandOptBool(cmd, "unsafe"))
         flags |= VIR_MIGRATE_UNSAFE;
 
-    if (vshCommandOptBool(cmd, "offline")) {
-        if (!virDomainIsActive(dom))
+    if (vshCommandOptBool(cmd, "offline"))
             flags |= VIR_MIGRATE_OFFLINE;
+
+    if (virDomainIsActive(dom) && (flags & VIR_MIGRATE_OFFLINE)) {
+        vshError(ctl, "%s", _("unable to perform offline migration when the domain is active"));
+        goto out;
     }
 
     if (xmlfile &&
-- 
1.7.8.6


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]