On Mon, Sep 28, 2009 at 02:26:36PM +0100, Mark McLoughlin wrote: > 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 ... ....for now There's an open RFE to support monitoring the progress of migration which this method will assist with. This whole series of refactoring is really to help with my work to allow migration to be done without blocking the application caller, via a forthcoming async-job API,as well as to allow easier integration of the new QMP protocol and detection of async monitor events from QEMU. > Looks fine, but have you checked this format has always been the same? A > comment showing the format being parsed would be good too Will add a comment. This data hasn't been around in QEMU for all that long, but I didn't see evidence of it having changed since its introduction Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list