[libvirt] [PATCH] virsh: Don't clear old connection if 'connect $uri' fails

Cole Robinson crobinso at redhat.com
Wed Apr 20 18:19:06 UTC 2016


    virsh # list --all
     Id    Name                           State
    ----------------------------------------------------
     1     test                           running

    virsh # connect frob
    error: Failed to connect to the hypervisor
    error: no connection driver available for frob

    virsh # list --all
    error: failed to connect to the hypervisor
    error: no valid connection
    error: no connection driver available for frob

Seems sensible IMO to just not clear out the old connection state
until the new virConnectOpen succeeds.

https://bugzilla.redhat.com/show_bug.cgi?id=829160
---
There was an older discussion here:

https://www.redhat.com/archives/libvir-list/2012-June/msg00270.html

That seemed to go off into the weeds a bit, talking about caching old
URIs... This approach seems fine for me to address the bug report but
maybe I missed something

 tools/virsh.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/tools/virsh.c b/tools/virsh.c
index 0d8ec5c..353a5d8 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -292,6 +292,17 @@ cmdConnect(vshControl *ctl, const vshCmd *cmd)
     bool ro = vshCommandOptBool(cmd, "readonly");
     const char *name = NULL;
     virshControlPtr priv = ctl->privData;
+    virConnectPtr conn;
+
+    if (vshCommandOptStringReq(ctl, cmd, "name", &name) < 0)
+        return false;
+
+    conn = virshConnect(ctl, name, ro);
+
+    if (!conn) {
+        vshError(ctl, "%s", _("Failed to connect to the hypervisor"));
+        return false;
+    }
 
     if (priv->conn) {
         int ret;
@@ -303,13 +314,10 @@ cmdConnect(vshControl *ctl, const vshCmd *cmd)
         else if (ret > 0)
             vshError(ctl, "%s", _("One or more references were leaked after "
                                   "disconnect from the hypervisor"));
-        priv->conn = NULL;
     }
+    priv->conn = conn;
 
     VIR_FREE(ctl->connname);
-    if (vshCommandOptStringReq(ctl, cmd, "name", &name) < 0)
-        return false;
-
     ctl->connname = vshStrdup(ctl, name);
 
     priv->useGetInfo = false;
@@ -317,13 +325,6 @@ cmdConnect(vshControl *ctl, const vshCmd *cmd)
     priv->blockJobNoBytes = false;
     priv->readonly = ro;
 
-    priv->conn = virshConnect(ctl, ctl->connname, priv->readonly);
-
-    if (!priv->conn) {
-        vshError(ctl, "%s", _("Failed to connect to the hypervisor"));
-        return false;
-    }
-
     if (virConnectRegisterCloseCallback(priv->conn, virshCatchDisconnect,
                                         ctl, NULL) < 0)
         vshError(ctl, "%s", _("Unable to register disconnect callback"));
-- 
2.7.3




More information about the libvir-list mailing list