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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list