[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCH] kill vm if saving config failed in v3 protocol



At 2011年07月11日 17:25, Daniel P. Berrange write:
On Mon, Jul 11, 2011 at 09:25:40AM +0800, Wen Congyang wrote:
At 07/01/2011 06:05 PM, Wen Congyang Write:
If virDomainSaveConfig() failed, we will return NULL to source,
and the vm is still available to restart during confirm() step in
v3 protocol. So we should kill it off in qemuMigrationFinish().

In v2 protocol, we should not set vm to NULL, because we hold
a reference of vm and should unrefernce it.

---
  src/qemu/qemu_migration.c |   21 +++++++++++++++++++--
  1 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 800b714..fa98cba 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2471,7 +2471,7 @@ qemuMigrationFinish(struct qemud_driver *driver,
          if (!virDomainObjIsActive(vm)) {
              qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                              _("guest unexpectedly quit"));
-            goto cleanup;
+            goto endjob;
          }

          qemuMigrationVPAssociatePortProfiles(vm->def);
@@ -2491,7 +2491,24 @@ qemuMigrationFinish(struct qemud_driver *driver,
                   * Return a NULL dom pointer, and hope that this is a rare
                   * situation and management tools are smart.
                   */
-                vm = NULL;
+
+                /*
+                 * In v3 protocol, the source VM is still available to
+                 * restart during confirm() step, so we kill it off
+                 * now.
+                 * In v2 protocol, the source is dead, so we leave
+                 * target in paused state, in case admin can fix
+                 * things up
+                 */
+                if (v3proto) {
+                    qemuProcessStop(driver, vm, 1, VIR_DOMAIN_SHUTOFF_FAILED);
+                    qemuAuditDomainStop(vm, "failed");
+                    if (newVM) {
+                        if (qemuDomainObjEndJob(vm)>  0)
+                            virDomainRemoveInactive(&driver->domains, vm);
+                        vm = NULL;
+                    }
+                }
                  goto endjob;
              }


ACK

Thanks, pushed.


Daniel


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]