[libvirt] [PATCH] qemu: Check QEMU error on failed migration
Pavel Hrdina
phrdina at redhat.com
Mon Oct 16 15:18:58 UTC 2017
On Thu, Oct 12, 2017 at 03:48:29PM +0200, Jiri Denemark wrote:
> When migration fails, QEMU may provide a description of the error in
> the reply to query-migrate QMP command. We can fetch this error and use
> it instead of the generic "unexpectedly failed" message.
>
> Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
> ---
> src/qemu/qemu_driver.c | 3 ++-
> src/qemu/qemu_migration.c | 36 +++++++++++++++++++++++-------------
> src/qemu/qemu_migration.h | 3 ++-
> src/qemu/qemu_monitor.c | 8 ++++++--
> src/qemu/qemu_monitor.h | 3 ++-
> src/qemu/qemu_monitor_json.c | 18 ++++++++++++++----
> src/qemu/qemu_monitor_json.h | 3 ++-
> tests/qemumonitorjsontest.c | 29 ++++++++++++++++++++++++++---
> 8 files changed, 77 insertions(+), 26 deletions(-)
[...]
> diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c
> index df3ef0a932..475fd270e1 100644
> --- a/tests/qemumonitorjsontest.c
> +++ b/tests/qemumonitorjsontest.c
> @@ -1907,6 +1907,7 @@ testQemuMonitorJSONqemuMonitorJSONGetMigrationStats(const void *data)
> qemuMonitorTestPtr test = qemuMonitorTestNewSimple(true, xmlopt);
> int ret = -1;
> qemuMonitorMigrationStats stats, expectedStats;
> + char *error = NULL;
>
> if (!test)
> return -1;
> @@ -1931,21 +1932,43 @@ testQemuMonitorJSONqemuMonitorJSONGetMigrationStats(const void *data)
> " }"
> " },"
> " \"id\": \"libvirt-13\""
> + "}") < 0 ||
> + qemuMonitorTestAddItem(test, "query-migrate",
> + "{"
> + " \"return\": {"
> + " \"status\": \"failed\","
> + " \"error-desc\": \"It's broken\""
> + " },"
> + " \"id\": \"libvirt-14\""
> "}") < 0)
> goto cleanup;
>
> - if (qemuMonitorJSONGetMigrationStats(qemuMonitorTestGetMonitor(test), &stats) < 0)
> + if (qemuMonitorJSONGetMigrationStats(qemuMonitorTestGetMonitor(test),
> + &stats, &error) < 0)
> goto cleanup;
>
> - if (memcmp(&stats, &expectedStats, sizeof(stats)) != 0) {
> + if (memcmp(&stats, &expectedStats, sizeof(stats)) != 0 || error) {
> virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - "Invalid migration status");
> + "Invalid migration statistics");
> + goto cleanup;
> + }
Do we need to pass the "&error" for the first call of
qemuMonitorJSONGetMigrationStats() since we know the answer?
> +
> + memset(&stats, 0, sizeof(stats));
> + if (qemuMonitorJSONGetMigrationStats(qemuMonitorTestGetMonitor(test),
> + &stats, &error) < 0)
> + goto cleanup;
> +
> + if (stats.status != QEMU_MONITOR_MIGRATION_STATUS_ERROR ||
> + STRNEQ_NULLABLE(error, "It's broken")) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + "Invalid failed migration status");
> goto cleanup;
> }
>
> ret = 0;
> cleanup:
> qemuMonitorTestFree(test);
> + VIR_FREE(error);
> return ret;
> }
Reviewed-by: Pavel Hrdina <phrdina at redhat.com>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20171016/1ab5bef1/attachment-0001.sig>
More information about the libvir-list
mailing list