forked from pool/libvirt
55 lines
1.8 KiB
Diff
55 lines
1.8 KiB
Diff
|
commit 4301b95af7f554700de8e69ecf3f3bb3148b1d44
|
||
|
Author: Jim Fehlig <jfehlig@novell.com>
|
||
|
Date: Thu Jan 13 12:52:23 2011 -0700
|
||
|
|
||
|
[v2] qemu: Retry JSON monitor cont cmd on MigrationExpected error
|
||
|
|
||
|
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
|
||
|
|
||
|
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
|
||
|
index 2e159c7..ca06e7e 100644
|
||
|
--- a/src/qemu/qemu_monitor_json.c
|
||
|
+++ b/src/qemu/qemu_monitor_json.c
|
||
|
@@ -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);
|