[libvirt] [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 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 7387089..35db285 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); -- 1.7.3.1

On Thu, Jan 20, 2011 at 07:27:14PM -0700, Jim Fehlig wrote:
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 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 7387089..35db285 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);
Looks fine to me now, ACK, Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

Daniel Veillard wrote:
On Thu, Jan 20, 2011 at 07:27:14PM -0700, Jim Fehlig wrote:
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 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 7387089..35db285 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);
Looks fine to me now, ACK,
Thanks; pushed. Regards, Jim
participants (2)
-
Daniel Veillard
-
Jim Fehlig