In case of non-p2p migration, in case libvirt client gets disconnected from source libvirt after PERFORM phase is over, the daemon just resets the current migration job. However, the VM could be left paused on both source and destination in such case. In case the client reconnects and queries migration status, the job has been blanked out from source libvirt, and this reconnected client has no clear way of figuring out if an unclean migration had previously been aborted. This patch calls out a "potentially" incomplete migration as a failed job, so that a client may be able to watch previously failed jobs for this VM and take corrective actions as needed. Signed-off-by: Prerna Saxena <saxenap.ltc@xxxxxxxxx> --- src/qemu/qemu_domain.c | 16 ++++++++++++++++ src/qemu/qemu_domain.h | 2 ++ src/qemu/qemu_migration.c | 4 ++-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index e8e0313..7c60d17 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4564,6 +4564,22 @@ qemuDomainObjDiscardAsyncJob(virQEMUDriverPtr driver, virDomainObjPtr obj) qemuDomainObjSaveJob(driver, obj); } + +void +qemuDomainObjFailAsyncJob(virQEMUDriverPtr driver, virDomainObjPtr obj) +{ + qemuDomainObjPrivatePtr priv = obj->privateData; + VIR_FREE(priv->job.completed); + if (VIR_ALLOC(priv->job.completed) == 0) { + priv->job.current->type = VIR_DOMAIN_JOB_FAILED; + priv->job.completed = priv->job.current; + } else { + VIR_WARN("Unable to allocate job.completed for VM %s", obj->def->name); + } + qemuDomainObjResetAsyncJob(priv); + qemuDomainObjEndJob(driver, obj); +} + void qemuDomainObjReleaseAsyncJob(virDomainObjPtr obj) { diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index c33af36..6465603 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -497,6 +497,8 @@ void qemuDomainObjRestoreJob(virDomainObjPtr obj, struct qemuDomainJobObj *job); void qemuDomainObjDiscardAsyncJob(virQEMUDriverPtr driver, virDomainObjPtr obj); +void qemuDomainObjFailAsyncJob(virQEMUDriverPtr driver, + virDomainObjPtr obj); void qemuDomainObjReleaseAsyncJob(virDomainObjPtr obj); qemuMonitorPtr qemuDomainGetMonitor(virDomainObjPtr vm) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 69eb231..fd8950e 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1911,8 +1911,8 @@ qemuMigrationCleanup(virDomainObjPtr vm, VIR_WARN("Migration of domain %s finished but we don't know if the" " domain was successfully started on destination or not", vm->def->name); - /* clear the job and let higher levels decide what to do */ - qemuDomainObjDiscardAsyncJob(driver, vm); + /* clearly "fail" the job and let higher levels decide what to do */ + qemuDomainObjFailAsyncJob(driver, vm); break; case QEMU_MIGRATION_PHASE_PERFORM3: -- 1.7.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list