]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Call migrate-incoming with exit-on-error=false
authorJiri Denemark <jdenemar@redhat.com>
Tue, 10 Dec 2024 11:28:53 +0000 (12:28 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Thu, 19 Dec 2024 14:21:21 +0000 (15:21 +0100)
The exit-on-error=false argument of migrate-incoming tells the QEMU
process to keep running when incoming migration fails, which helps us in
two ways:

1. When migration enters Finish phase to cleanup the process, the domain
   might not even exist on the destination (because it has already been
   cleaned up by EOF monitor callback) and we would get rather unhelpful
   "operation failed: domain is no longer running" error message.

2. We can get the error that caused incoming migration to fail directly
   from QEMU via query-migrate QMP command.

https://issues.redhat.com/browse/RHEL-7041

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_migration.c
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_json.h

index f9f40a2b03973d36a554d3c943531d20dcf74fad..50e350b0c4da78d4377b6c547d2f3901651f4a84 100644 (file)
@@ -2378,11 +2378,18 @@ qemuMigrationDstRun(virDomainObj *vm,
                     const char *uri,
                     virDomainAsyncJob asyncJob)
 {
+    virTristateBool exitOnError = VIR_TRISTATE_BOOL_ABSENT;
     qemuDomainObjPrivate *priv = vm->privateData;
     int rv;
 
     VIR_DEBUG("Setting up incoming migration with URI %s", uri);
 
+    /* Ask QEMU not to exit on failure during incoming migration (if supported)
+     * so that we can properly check and report error during Finish phase.
+     */
+    if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATE_INCOMING_EXIT_ON_ERROR))
+        exitOnError = VIR_TRISTATE_BOOL_NO;
+
     if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0)
         return -1;
 
@@ -2390,7 +2397,7 @@ qemuMigrationDstRun(virDomainObj *vm,
     if (rv < 0)
         goto exit_monitor;
 
-    rv = qemuMonitorMigrateIncoming(priv->mon, uri);
+    rv = qemuMonitorMigrateIncoming(priv->mon, uri, exitOnError);
 
  exit_monitor:
     qemuDomainObjExitMonitor(vm);
index c198ddb6257044ce0544f68ba2a69f9a511f371d..ec2f1667853c9009b83b0c91d2dc03eb7fcb064a 100644 (file)
@@ -3811,13 +3811,15 @@ qemuMonitorGetMemoryDeviceInfo(qemuMonitor *mon,
 
 int
 qemuMonitorMigrateIncoming(qemuMonitor *mon,
-                           const char *uri)
+                           const char *uri,
+                           virTristateBool exitOnError)
 {
-    VIR_DEBUG("uri=%s", uri);
+    VIR_DEBUG("uri=%s, exitOnError=%s",
+              uri, virTristateBoolTypeToString(exitOnError));
 
     QEMU_CHECK_MONITOR(mon);
 
-    return qemuMonitorJSONMigrateIncoming(mon, uri);
+    return qemuMonitorJSONMigrateIncoming(mon, uri, exitOnError);
 }
 
 
index ac3a7b6db3bfd03da78faa9bb875a43cd8ad39ab..c74892c4dc6b7968eda081fd6a75cfefee24e69a 100644 (file)
@@ -1294,7 +1294,8 @@ int qemuMonitorGetMemoryDeviceInfo(qemuMonitor *mon,
     ATTRIBUTE_NONNULL(2);
 
 int qemuMonitorMigrateIncoming(qemuMonitor *mon,
-                               const char *uri);
+                               const char *uri,
+                               virTristateBool exitOnError);
 
 int qemuMonitorMigrateStartPostCopy(qemuMonitor *mon);
 
index 6500e01d3fac02418a8116aa4f05997065df9104..9f417d27c68e08c7e2428301ebcdbc1851ca7ed2 100644 (file)
@@ -7269,13 +7269,15 @@ qemuMonitorJSONFindLinkPath(qemuMonitor *mon,
 
 int
 qemuMonitorJSONMigrateIncoming(qemuMonitor *mon,
-                               const char *uri)
+                               const char *uri,
+                               virTristateBool exitOnError)
 {
     g_autoptr(virJSONValue) cmd = NULL;
     g_autoptr(virJSONValue) reply = NULL;
 
     if (!(cmd = qemuMonitorJSONMakeCommand("migrate-incoming",
                                            "s:uri", uri,
+                                           "T:exit-on-error", exitOnError,
                                            NULL)))
         return -1;
 
index 0214e9e9ff59141bb52baf6459c4066051e9544a..2f5a021f5614c7ee385fd052174adf8bfe643fbf 100644 (file)
@@ -607,7 +607,8 @@ qemuMonitorJSONFindLinkPath(qemuMonitor *mon,
 
 int
 qemuMonitorJSONMigrateIncoming(qemuMonitor *mon,
-                               const char *uri)
+                               const char *uri,
+                               virTristateBool exitOnError)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
 int