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