diff --git a/src/rpc/virkeepalive.c b/src/rpc/virkeepalive.c index c882313339ff947b4b173594282bf6b2339f1b4f..c9faf885901edc2fe361b19374c36821a47346f0 100644 --- a/src/rpc/virkeepalive.c +++ b/src/rpc/virkeepalive.c @@ -136,11 +136,11 @@ virKeepAliveTimerInternal(virKeepAlivePtr ka, ka, ka->client, ka->countToDeath, timeval); if (ka->countToDeath == 0) { - VIR_WARN("No response from client %p after %d keepalive messages in" - " %d seconds", - ka->client, - ka->count, - timeval); + VIR_DEBUG("No response from client %p after %d keepalive messages " + "in %d seconds", + ka->client, ka->count, timeval); + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("connection closed due to keepalive timeout")); return true; } else { ka->countToDeath--; diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c index d0b96b654f38aac03b3e40d2b5370e230e38f207..6e59ea6f240ef4f47fe859c88e124eacc6ebbe4b 100644 --- a/src/rpc/virnetclient.c +++ b/src/rpc/virnetclient.c @@ -107,6 +107,7 @@ struct _virNetClient { virKeepAlivePtr keepalive; bool wantClose; int closeReason; + virErrorPtr error; virNetClientCloseFunc closeCb; void *closeOpaque; @@ -636,10 +637,14 @@ virNetClientMarkClose(virNetClientPtr client, int reason) { VIR_DEBUG("client=%p, reason=%d", client, reason); + if (client->sock) virNetSocketRemoveIOCallback(client->sock); + /* Don't override reason that's already set. */ if (!client->wantClose) { + if (!client->error) + client->error = virSaveLastError(); client->wantClose = true; client->closeReason = reason; } @@ -670,6 +675,9 @@ virNetClientCloseLocked(virNetClientPtr client) client->keepalive = NULL; client->wantClose = false; + virFreeError(client->error); + client->error = NULL; + if (ka || client->closeCb) { virNetClientCloseFunc closeCb = client->closeCb; void *closeOpaque = client->closeOpaque; @@ -1602,6 +1610,10 @@ static int virNetClientIOEventLoop(virNetClientPtr client, } error: + if (client->error) { + VIR_DEBUG("error on socket: %s", client->error->message); + virSetError(client->error); + } virNetClientCallRemove(&client->waitDispatch, thiscall); virNetClientIOEventLoopPassTheBuck(client, thiscall); return -1;