Commit 676cb4f4e762b8682a06c6dab1f690fbcd939550 added client keepalive
support for virsh. But because whenever the connection is closed, virsh
tries to reconnect, unless the disconnection happened with the reason
VIR_CONNECT_CLOSE_REASON_CLIENT. Because of that, virsh kept trying to
reconnect even when the connection was closed due to keepalive.
Resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=1073506
Signed-off-by: Martin Kletzander <mkletzan(a)redhat.com>
---
tools/virsh.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/tools/virsh.c b/tools/virsh.c
index bcfa561..98d8d18 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -327,9 +327,14 @@ static int disconnected; /* we may have been disconnected */
static void
vshCatchDisconnect(virConnectPtr conn ATTRIBUTE_UNUSED,
int reason,
- void *opaque ATTRIBUTE_UNUSED)
+ void *opaque)
{
- if (reason != VIR_CONNECT_CLOSE_REASON_CLIENT)
+ vshControl *ctl = opaque;
+
+ vshDebug(ctl, VSH_ERR_INFO, "Received disconnect with reason '%d'",
reason);
+
+ if (reason != VIR_CONNECT_CLOSE_REASON_CLIENT &&
+ reason != VIR_CONNECT_CLOSE_REASON_KEEPALIVE)
disconnected++;
}
@@ -407,7 +412,7 @@ vshReconnect(vshControl *ctl)
vshError(ctl, "%s", _("failed to connect to the
hypervisor"));
} else {
if (virConnectRegisterCloseCallback(ctl->conn, vshCatchDisconnect,
- NULL, NULL) < 0)
+ ctl, NULL) < 0)
vshError(ctl, "%s", _("Unable to register disconnect
callback"));
if (connected)
vshError(ctl, "%s", _("Reconnected to the hypervisor"));
@@ -484,7 +489,7 @@ cmdConnect(vshControl *ctl, const vshCmd *cmd)
}
if (virConnectRegisterCloseCallback(ctl->conn, vshCatchDisconnect,
- NULL, NULL) < 0)
+ ctl, NULL) < 0)
vshError(ctl, "%s", _("Unable to register disconnect
callback"));
return true;
--
2.1.3