]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
[v2] qemu: Retry JSON monitor cont cmd on MigrationExpected error
authorJim Fehlig <jfehlig@novell.com>
Thu, 13 Jan 2011 19:52:23 +0000 (12:52 -0700)
committerJim Fehlig <jfehlig@novell.com>
Fri, 21 Jan 2011 16:35:57 +0000 (09:35 -0700)
When restoring a saved qemu instance via JSON monitor, the vm is
left in a paused state.  Turns out the 'cont' cmd was failing with
"MigrationExpected" error class and "An incoming migration is
expected before this command can be executed" error description
due to migration (restore) not yet complete.

Detect if 'cont' cmd fails with "MigrationExpecte" error class and
retry 'cont' cmd.

V2: Fix potential double-free noted by Laine Stump

src/qemu/qemu_monitor_json.c

index 2e159c754bf0b31a2c9f20d2395b3c275d19a432..ca06e7e8d240820a8491124d6018066acae472d1 100644 (file)
@@ -702,13 +702,29 @@ qemuMonitorJSONStartCPUs(qemuMonitorPtr mon,
     int ret;
     virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("cont", NULL);
     virJSONValuePtr reply = NULL;
+    int i = 0, timeout = 3;
     if (!cmd)
         return -1;
 
-    ret = qemuMonitorJSONCommand(mon, cmd, &reply);
+    do {
+        ret = qemuMonitorJSONCommand(mon, cmd, &reply);
 
-    if (ret == 0)
-        ret = qemuMonitorJSONCheckError(cmd, reply);
+        if (ret != 0)
+            break;
+
+        /* If no error, we're done */
+        if ((ret = qemuMonitorJSONCheckError(cmd, reply)) == 0)
+            break;
+
+        /* If error class is not MigrationExpected, we're done.
+         * Otherwise try 'cont' cmd again */
+        if (!qemuMonitorJSONHasError(reply, "MigrationExpected"))
+            break;
+
+        virJSONValueFree(reply);
+        reply = NULL;
+        usleep(250000);
+    } while (++i <= timeout);
 
     virJSONValueFree(cmd);
     virJSONValueFree(reply);