[libvirt] [PATCH v3 24/24] DO NOT APPLY: qemu: Work around weird migration status changes

Jiri Denemark jdenemar at redhat.com
Wed Jun 10 13:42:58 UTC 2015


When cancelling migration we can see the following conversation on QMP
monitor:

{"execute":"migrate_cancel","id":"libvirt-33"}
{"timestamp": {"seconds": 1432899178, "microseconds": 844907}, "event":
"MIGRATION", "data": {"status": "cancelling"}}
{"return": {}, "id": "libvirt-33"}
{"timestamp": {"seconds": 1432899178, "microseconds": 845625}, "event":
"MIGRATION", "data": {"status": "failed"}}
{"timestamp": {"seconds": 1432899178, "microseconds": 846432}, "event":
"MIGRATION", "data": {"status": "cancelled"}}

That is, migration status first changes to "failed" just to change to
the correct "cancelled" state in a few moments later. However, this is
enough to let libvirt report migration failed for unknown reason instead
of having been cancelled by a user.

This should really be fixed in QEMU but I'm not sure how easy it is.
However, it's pretty easy for us to work around it.

Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
---

Notes:
    Version 3:
    - mark as "DO NOT APPLY" -- Juan will fix the bug in QEMU in the
      next version of his migration event series
    
    Version 2:
    - new patch

 src/qemu/qemu_process.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 93c0844..dd43657 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -1518,6 +1518,7 @@ qemuProcessHandleMigrationStatus(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
                                  void *opaque ATTRIBUTE_UNUSED)
 {
     qemuDomainObjPrivatePtr priv;
+    qemuDomainJobInfoPtr jobInfo;
 
     virObjectLock(vm);
 
@@ -1532,7 +1533,15 @@ qemuProcessHandleMigrationStatus(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
         goto cleanup;
     }
 
-    priv->job.current->status.status = status;
+    jobInfo = priv->job.current;
+    if (status == QEMU_MONITOR_MIGRATION_STATUS_ERROR &&
+        jobInfo->status.status == QEMU_MONITOR_MIGRATION_STATUS_CANCELLING) {
+        VIR_DEBUG("State changed from \"cancelling\" to \"failed\"; setting "
+                  "current state to \"cancelled\"");
+        status = QEMU_MONITOR_MIGRATION_STATUS_CANCELLED;
+    }
+
+    jobInfo->status.status = status;
     virDomainObjSignal(vm);
 
  cleanup:
-- 
2.4.3




More information about the libvir-list mailing list