
On Thu, 2009-09-24 at 16:00 +0100, Daniel P. Berrange wrote:
* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h: Add new qemuMonitorGetMigrationStatus() command. * src/qemu/qemu_driver.c: Use new qemuMonitorGetMigrationStatus() command to check completion status. --- src/qemu/qemu_driver.c | 15 +++++-- src/qemu/qemu_monitor_text.c | 91 ++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor_text.h | 16 +++++++ 3 files changed, 117 insertions(+), 5 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ccc13c4..a6300c9 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6499,6 +6499,8 @@ qemudDomainMigratePerform (virDomainPtr dom, char *info = NULL; int ret = -1; int paused = 0; + int status; + unsigned long long transferred, remaining, total;
qemuDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, dom->uuid); @@ -6562,14 +6564,17 @@ qemudDomainMigratePerform (virDomainPtr dom, * rather failed later on. Check the output of "info migrate" */ VIR_FREE(info); - if (qemudMonitorCommand(vm, "info migrate", &info) < 0) { - qemudReportError (dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED, - "%s", _("could not get info about migration")); + + if (qemuMonitorGetMigrationStatus(vm, &status, + &transferred, + &remaining, + &total) < 0) { goto cleanup; } - if (strstr(info, "fail") != NULL) { + + if (status != QEMU_MONITOR_MIGRATION_STATUS_COMPLETED) { qemudReportError (dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED, - _("migrate failed: %s"), info); + "%s", _("migrate did not successfully complete")); goto cleanup; }
diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c index d9227a2..0b746b9 100644 --- a/src/qemu/qemu_monitor_text.c +++ b/src/qemu/qemu_monitor_text.c @@ -28,6 +28,7 @@ #include <sys/un.h> #include <poll.h> #include <unistd.h> +#include <string.h>
#include "qemu_monitor_text.h" #include "qemu_conf.h" @@ -997,3 +998,93 @@ cleanup: VIR_FREE(cmd); return ret; } + + +#define MIGRATION_PREFIX "Migration status: " +#define MIGRATION_TRANSFER_PREFIX "transferred ram: " +#define MIGRATION_REMAINING_PREFIX "remaining ram: " +#define MIGRATION_TOTAL_PREFIX "total ram: " + +VIR_ENUM_DECL(qemuMonitorMigrationStatus) +VIR_ENUM_IMPL(qemuMonitorMigrationStatus, + QEMU_MONITOR_MIGRATION_STATUS_LAST, + "inactive", "active", "completed", "failed", "cancelled") + +int qemuMonitorGetMigrationStatus(const virDomainObjPtr vm, + int *status, + unsigned long long *transferred, + unsigned long long *remaining, + unsigned long long *total) {
You went a bit crazy here! New code to parse a bunch of stuff that is then ignored ... Looks fine, but have you checked this format has always been the same? A comment showing the format being parsed would be good too ACK Cheers, Mark.