From 4301b95af7f554700de8e69ecf3f3bb3148b1d44 Mon Sep 17 00:00:00 2001 From: Jim Fehlig Date: Thu, 13 Jan 2011 12:52:23 -0700 Subject: [PATCH] [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 --- src/qemu/qemu_monitor_json.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 2e159c754b..ca06e7e8d2 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);