mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-02 11:05:22 +00:00
client rpc: Send keepalive requests from IO event loop
In addition to keepalive responses, we also need to send keepalive
requests from client IO loop to properly detect dead connection in case
a libvirt API is called from the main loop, which prevents any timers to
be called.
(cherry picked from commit 4d971dc7ef
)
This commit is contained in:
parent
f8e651117f
commit
e9c00cbc63
@ -1272,6 +1272,7 @@ static int virNetClientIOEventLoop(virNetClientPtr client,
|
||||
char ignore;
|
||||
sigset_t oldmask, blockedsigs;
|
||||
int timeout = -1;
|
||||
virNetMessagePtr msg = NULL;
|
||||
|
||||
/* If we have existing SASL decoded data we don't want to sleep in
|
||||
* the poll(), just check if any other FDs are also ready.
|
||||
@ -1285,6 +1286,10 @@ static int virNetClientIOEventLoop(virNetClientPtr client,
|
||||
if (thiscall->nonBlock)
|
||||
timeout = 0;
|
||||
|
||||
/* Limit timeout so that we can send keepalive request in time */
|
||||
if (timeout == -1)
|
||||
timeout = virKeepAliveTimeout(client->keepalive);
|
||||
|
||||
fds[0].events = fds[0].revents = 0;
|
||||
fds[1].events = fds[1].revents = 0;
|
||||
|
||||
@ -1330,6 +1335,13 @@ static int virNetClientIOEventLoop(virNetClientPtr client,
|
||||
|
||||
virNetClientLock(client);
|
||||
|
||||
if (virKeepAliveTrigger(client->keepalive, &msg)) {
|
||||
client->wantClose = true;
|
||||
} else if (msg && virNetClientQueueNonBlocking(client, msg) < 0) {
|
||||
VIR_WARN("Could not queue keepalive request");
|
||||
virNetMessageFree(msg);
|
||||
}
|
||||
|
||||
/* If we have existing SASL decoded data, pretend
|
||||
* the socket became readable so we consume it
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user