[libvirt] [PATCH 06/12] rpc: Refactor keepalive timer code

Jiri Denemark jdenemar at redhat.com
Tue Jun 12 23:29:24 UTC 2012


The code that needs to be run every keepalive interval of inactivity was
only called from a timer and thus from the main event loop. We will need
to call the code directly from another place.
---
 src/rpc/virkeepalive.c |   57 +++++++++++++++++++++++++++++-------------------
 1 file changed, 35 insertions(+), 22 deletions(-)

diff --git a/src/rpc/virkeepalive.c b/src/rpc/virkeepalive.c
index a5c2b1a..b2e260e 100644
--- a/src/rpc/virkeepalive.c
+++ b/src/rpc/virkeepalive.c
@@ -152,51 +152,64 @@ virKeepAliveScheduleResponse(virKeepAlivePtr ka)
 }
 
 
-static void
-virKeepAliveTimer(int timer ATTRIBUTE_UNUSED, void *opaque)
+static bool
+virKeepAliveTimerInternal(virKeepAlivePtr ka,
+                          virNetMessagePtr *msg)
 {
-    virKeepAlivePtr ka = opaque;
     time_t now = time(NULL);
 
-    virKeepAliveLock(ka);
+    if (now - ka->lastPacketReceived < ka->interval - 1) {
+        int timeout = ka->interval - (now - ka->lastPacketReceived);
+        virEventUpdateTimeout(ka->timer, timeout * 1000);
+        return false;
+    }
 
     PROBE(RPC_KEEPALIVE_TIMEOUT,
           "ka=%p client=%p countToDeath=%d idle=%d",
           ka, ka->client, ka->countToDeath,
           (int) (now - ka->lastPacketReceived));
 
-    if (now - ka->lastPacketReceived < ka->interval - 1) {
-        int timeout = ka->interval - (now - ka->lastPacketReceived);
-        virEventUpdateTimeout(ka->timer, timeout * 1000);
-        goto cleanup;
-    }
 
     if (ka->countToDeath == 0) {
-        virKeepAliveDeadFunc deadCB = ka->deadCB;
-        void *client = ka->client;
-
         VIR_WARN("No response from client %p after %d keepalive messages in"
                  " %d seconds",
                  ka->client,
                  ka->count,
                  (int) (now - ka->lastPacketReceived));
+        return true;
+    } else {
+        ka->countToDeath--;
+        *msg = virKeepAliveMessage(KEEPALIVE_PROC_PING);
+        virEventUpdateTimeout(ka->timer, ka->interval * 1000);
+        return false;
+    }
+}
+
+
+static void
+virKeepAliveTimer(int timer ATTRIBUTE_UNUSED, void *opaque)
+{
+    virKeepAlivePtr ka = opaque;
+    virNetMessagePtr msg = NULL;
+    bool dead;
+
+    virKeepAliveLock(ka);
+
+    dead = virKeepAliveTimerInternal(ka, &msg);
+
+    if (dead) {
+        virKeepAliveDeadFunc deadCB = ka->deadCB;
+        void *client = ka->client;
+
         ka->refs++;
         virKeepAliveUnlock(ka);
         deadCB(client);
         virKeepAliveLock(ka);
         ka->refs--;
-    } else {
-        virNetMessagePtr msg;
-
-        ka->countToDeath--;
-        if (!(msg = virKeepAliveMessage(KEEPALIVE_PROC_PING)))
-            VIR_WARN("Failed to generate keepalive request");
-        else
-            virKeepAliveSend(ka, msg);
-        virEventUpdateTimeout(ka->timer, ka->interval * 1000);
+    } else if (msg) {
+        virKeepAliveSend(ka, msg);
     }
 
-cleanup:
     virKeepAliveUnlock(ka);
 }
 
-- 
1.7.10.2




More information about the libvir-list mailing list