]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Various monitor improvements for migration.
authorChris Lalancette <clalance@redhat.com>
Wed, 30 Sep 2009 12:51:32 +0000 (14:51 +0200)
committerChris Lalancette <clalance@redhat.com>
Thu, 1 Oct 2009 11:24:22 +0000 (13:24 +0200)
The upcoming tunnelled migration needs to be able to set
a migration in progress in the background, as well as
be able to cancel a migration when a problem has happened.
This patch allows for both of these to properly work.

Signed-off-by: Chris Lalancette <clalance@redhat.com>
src/qemu/qemu_driver.c
src/qemu/qemu_monitor_text.c
src/qemu/qemu_monitor_text.h

index 155e4a301566cdd693cf83c8cd63d34cd346f8eb..70e9c702722986ce542b3b80271bda979af3c7c1 100644 (file)
@@ -3221,7 +3221,7 @@ static int qemudDomainSave(virDomainPtr dom,
 
     if (header.compressed == QEMUD_SAVE_FORMAT_RAW) {
         const char *args[] = { "cat", NULL };
-        ret = qemuMonitorMigrateToCommand(vm, args, path);
+        ret = qemuMonitorMigrateToCommand(vm, 0, args, path);
     } else {
         const char *prog = qemudSaveCompressionTypeToString(header.compressed);
         const char *args[] = {
@@ -3229,7 +3229,7 @@ static int qemudDomainSave(virDomainPtr dom,
             "-c",
             NULL
         };
-        ret = qemuMonitorMigrateToCommand(vm, args, path);
+        ret = qemuMonitorMigrateToCommand(vm, 0, args, path);
     }
 
     if (ret < 0)
@@ -3303,7 +3303,7 @@ static int qemudDomainCoreDump(virDomainPtr dom,
         paused = 1;
     }
 
-    ret = qemuMonitorMigrateToCommand(vm, args, path);
+    ret = qemuMonitorMigrateToCommand(vm, 0, args, path);
     paused = 1;
 cleanup:
 
@@ -6041,7 +6041,7 @@ qemudDomainMigratePerform (virDomainPtr dom,
         goto cleanup;
     }
 
-    if (qemuMonitorMigrateToHost(vm, uribits->server, uribits->port) < 0)
+    if (qemuMonitorMigrateToHost(vm, 0, uribits->server, uribits->port) < 0)
         goto cleanup;
 
     /* it is also possible that the migrate didn't fail initially, but
index f57460c1fa1e989522f447a75b5ec8f6c5284644..5054adfb1eb987c2b4c7f503b1bf1c12a7349624 100644 (file)
@@ -1138,19 +1138,26 @@ cleanup:
 
 
 static int qemuMonitorMigrate(const virDomainObjPtr vm,
+                              int background,
                               const char *dest)
 {
     char *cmd = NULL;
     char *info = NULL;
     int ret = -1;
     char *safedest = qemuMonitorEscapeArg(dest);
+    const char *extra;
 
     if (!safedest) {
         virReportOOMError(NULL);
         return -1;
     }
 
-    if (virAsprintf(&cmd, "migrate \"%s\"", safedest) < 0) {
+    if (background)
+        extra = "-d ";
+    else
+        extra = " ";
+
+    if (virAsprintf(&cmd, "migrate %s\"%s\"", extra, safedest) < 0) {
         virReportOOMError(NULL);
         goto cleanup;
     }
@@ -1186,6 +1193,7 @@ cleanup:
 }
 
 int qemuMonitorMigrateToHost(const virDomainObjPtr vm,
+                             int background,
                              const char *hostname,
                              int port)
 {
@@ -1200,7 +1208,7 @@ int qemuMonitorMigrateToHost(const virDomainObjPtr vm,
         return -1;
     }
 
-    ret = qemuMonitorMigrate(vm, uri);
+    ret = qemuMonitorMigrate(vm, background, uri);
 
     VIR_FREE(uri);
 
@@ -1209,6 +1217,7 @@ int qemuMonitorMigrateToHost(const virDomainObjPtr vm,
 
 
 int qemuMonitorMigrateToCommand(const virDomainObjPtr vm,
+                                int background,
                                 const char * const *argv,
                                 const char *target)
 {
@@ -1238,7 +1247,7 @@ int qemuMonitorMigrateToCommand(const virDomainObjPtr vm,
         goto cleanup;
     }
 
-    ret = qemuMonitorMigrate(vm, dest);
+    ret = qemuMonitorMigrate(vm, background, dest);
 
 cleanup:
     VIR_FREE(safe_target);
@@ -1247,6 +1256,38 @@ cleanup:
     return ret;
 }
 
+int qemuMonitorMigrateToUnix(const virDomainObjPtr vm,
+                             int background,
+                             const char *unixfile)
+{
+    char *dest = NULL;
+    int ret = -1;
+
+    if (virAsprintf(&dest, "unix:%s", unixfile) < 0) {
+        virReportOOMError(NULL);
+        return -1;
+    }
+
+    ret = qemuMonitorMigrate(vm, background, dest);
+
+    VIR_FREE(dest);
+
+    return ret;
+}
+
+int qemuMonitorMigrateCancel(const virDomainObjPtr vm)
+{
+    char *info = NULL;
+
+    if (qemuMonitorCommand(vm, "migrate cancel", &info) < 0) {
+        qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+                         "%s", _("cannot run monitor command to cancel migration"));
+        return -1;
+    }
+    VIR_FREE(info);
+
+    return 0;
+}
 
 int qemuMonitorAddUSBDisk(const virDomainObjPtr vm,
                           const char *path)
index 82dc5dff6cd3885cc99b52ece3e14e2f11848830..917545688eeab95624ed5f2191bde784a5f721a9 100644 (file)
@@ -96,13 +96,21 @@ int qemuMonitorGetMigrationStatus(const virDomainObjPtr vm,
                                   unsigned long long *total);
 
 int qemuMonitorMigrateToHost(const virDomainObjPtr vm,
+                             int background,
                              const char *hostname,
                              int port);
 
 int qemuMonitorMigrateToCommand(const virDomainObjPtr vm,
+                                int background,
                                 const char * const *argv,
                                 const char *target);
 
+int qemuMonitorMigrateToUnix(const virDomainObjPtr vm,
+                             int background,
+                             const char *unixfile);
+
+int qemuMonitorMigrateCancel(const virDomainObjPtr vm);
+
 
 /* XXX disk driver type eg,  qcow/etc.
  * XXX cache mode