]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
client rpc: Send keepalive requests from IO event loop
authorJiri Denemark <jdenemar@redhat.com>
Tue, 12 Jun 2012 12:32:27 +0000 (14:32 +0200)
committerCole Robinson <crobinso@redhat.com>
Mon, 13 Aug 2012 01:15:47 +0000 (21:15 -0400)
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 4d971dc7ef1a9d0dc830c243b5731e862ad0eb5c)

src/rpc/virnetclient.c

index 64738c3e97de527a44da2721908f70ac71043ce0..d8bb4174c0df8ea21fd63e64830e2938b5490b5b 100644 (file)
@@ -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
          */