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

[libvirt] [PATCH] Do not try to cancel non-existent migration on source



If migration failed on source daemon, the migration is automatically
canceled by the daemon itself. Thus we don't need to call
virDomainMigrateConfirm3(cancelled=1). Calling it doesn't cause any harm
but the resulting error message printed in logs may confuse people.
---
 src/libvirt.c |   41 +++++++++++++++++++++++++----------------
 1 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/src/libvirt.c b/src/libvirt.c
index c8af3e1..256828c 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -4141,6 +4141,7 @@ virDomainMigrateVersion3(virDomainPtr domain,
     virErrorPtr orig_err = NULL;
     int cancelled = 1;
     unsigned long protection = 0;
+    bool notify_source = true;
 
     VIR_DOMAIN_DEBUG(domain, "dconn=%p xmlin=%s, flags=%lx, "
                      "dname=%s, uri=%s, bandwidth=%lu",
@@ -4221,8 +4222,13 @@ virDomainMigrateVersion3(virDomainPtr domain,
          uri, flags | protection, dname, bandwidth);
 
     /* Perform failed. Make sure Finish doesn't overwrite the error */
-    if (ret < 0)
+    if (ret < 0) {
         orig_err = virSaveLastError();
+        /* Perform failed so we don't need to call confirm to let source know
+         * about the failure.
+         */
+        notify_source = false;
+    }
 
     /* If Perform returns < 0, then we need to cancel the VM
      * startup on the destination
@@ -4265,22 +4271,25 @@ finish:
 
 confirm:
     /*
-     * If cancelled, then src VM will be restarted, else
-     * it will be killed
-     */
-    VIR_DEBUG("Confirm3 %p ret=%d domain=%p", domain->conn, ret, domain);
-    VIR_FREE(cookiein);
-    cookiein = cookieout;
-    cookieinlen = cookieoutlen;
-    cookieout = NULL;
-    cookieoutlen = 0;
-    ret = domain->conn->driver->domainMigrateConfirm3
-        (domain, cookiein, cookieinlen,
-         flags | protection, cancelled);
-    /* If Confirm3 returns -1, there's nothing more we can
-     * do, but fortunately worst case is that there is a
-     * domain left in 'paused' state on source.
+     * If cancelled, then src VM will be restarted, else it will be killed.
+     * Don't do this if migration failed on source and thus it was already
+     * cancelled there.
      */
+    if (notify_source) {
+        VIR_DEBUG("Confirm3 %p ret=%d domain=%p", domain->conn, ret, domain);
+        VIR_FREE(cookiein);
+        cookiein = cookieout;
+        cookieinlen = cookieoutlen;
+        cookieout = NULL;
+        cookieoutlen = 0;
+        ret = domain->conn->driver->domainMigrateConfirm3
+            (domain, cookiein, cookieinlen,
+             flags | protection, cancelled);
+        /* If Confirm3 returns -1, there's nothing more we can
+         * do, but fortunately worst case is that there is a
+         * domain left in 'paused' state on source.
+         */
+    }
 
  done:
     if (orig_err) {
-- 
1.7.6


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