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. -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list