]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
rpc: Add APIs for direct triggering of keepalive timer
authorJiri Denemark <jdenemar@redhat.com>
Tue, 12 Jun 2012 21:42:32 +0000 (23:42 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Wed, 13 Jun 2012 13:46:07 +0000 (15:46 +0200)
Add virKeepAliveTimeout and virKeepAliveTrigger APIs that can be used to
set poll timeouts and trigger keepalive timer. virKeepAliveTrigger
checks if it is called to early and does nothing in that case.

src/rpc/virkeepalive.c
src/rpc/virkeepalive.h

index b2e260e8b968b080f035e47c9c12c41b8a48de8e..035ac74947c1b998b822e167cace4161f02b7a0b 100644 (file)
@@ -45,6 +45,7 @@ struct _virKeepAlive {
     unsigned int count;
     unsigned int countToDeath;
     time_t lastPacketReceived;
+    time_t intervalStart;
     int timer;
 
     virNetMessagePtr response;
@@ -158,8 +159,11 @@ virKeepAliveTimerInternal(virKeepAlivePtr ka,
 {
     time_t now = time(NULL);
 
-    if (now - ka->lastPacketReceived < ka->interval - 1) {
-        int timeout = ka->interval - (now - ka->lastPacketReceived);
+    if (ka->interval <= 0 || ka->intervalStart == 0)
+        return false;
+
+    if (now - ka->intervalStart < ka->interval) {
+        int timeout = ka->interval - (now - ka->intervalStart);
         virEventUpdateTimeout(ka->timer, timeout * 1000);
         return false;
     }
@@ -179,6 +183,7 @@ virKeepAliveTimerInternal(virKeepAlivePtr ka,
         return true;
     } else {
         ka->countToDeath--;
+        ka->intervalStart = now;
         *msg = virKeepAliveMessage(KEEPALIVE_PROC_PING);
         virEventUpdateTimeout(ka->timer, ka->interval * 1000);
         return false;
@@ -335,6 +340,7 @@ virKeepAliveStart(virKeepAlivePtr ka,
     int ret = -1;
     time_t delay;
     int timeout;
+    time_t now;
 
     virKeepAliveLock(ka);
 
@@ -365,11 +371,13 @@ virKeepAliveStart(virKeepAlivePtr ka,
           "ka=%p client=%p interval=%d count=%u",
           ka, ka->client, interval, count);
 
-    delay = time(NULL) - ka->lastPacketReceived;
+    now = time(NULL);
+    delay = now - ka->lastPacketReceived;
     if (delay > ka->interval)
         timeout = 0;
     else
         timeout = ka->interval - delay;
+    ka->intervalStart = now - (ka->interval - timeout);
     ka->timer = virEventAddTimeout(timeout * 1000, virKeepAliveTimer,
                                    ka, virKeepAliveTimerFree);
     if (ka->timer < 0)
@@ -427,6 +435,51 @@ virKeepAliveStopSending(virKeepAlivePtr ka)
 }
 
 
+int
+virKeepAliveTimeout(virKeepAlivePtr ka)
+{
+    int timeout;
+
+    if (!ka)
+        return -1;
+
+    virKeepAliveLock(ka);
+
+    if (ka->interval <= 0 || ka->intervalStart == 0) {
+        timeout = -1;
+    } else {
+        timeout = ka->interval - (time(NULL) - ka->intervalStart);
+        if (timeout < 0)
+            timeout = 0;
+    }
+
+    virKeepAliveUnlock(ka);
+
+    if (timeout < 0)
+        return -1;
+    else
+        return timeout * 1000;
+}
+
+
+bool
+virKeepAliveTrigger(virKeepAlivePtr ka,
+                    virNetMessagePtr *msg)
+{
+    bool dead;
+
+    *msg = NULL;
+    if (!ka)
+        return false;
+
+    virKeepAliveLock(ka);
+    dead = virKeepAliveTimerInternal(ka, msg);
+    virKeepAliveUnlock(ka);
+
+    return dead;
+}
+
+
 bool
 virKeepAliveCheckMessage(virKeepAlivePtr ka,
                          virNetMessagePtr msg)
@@ -442,7 +495,7 @@ virKeepAliveCheckMessage(virKeepAlivePtr ka,
     virKeepAliveLock(ka);
 
     ka->countToDeath = ka->count;
-    ka->lastPacketReceived = time(NULL);
+    ka->lastPacketReceived = ka->intervalStart = time(NULL);
 
     if (msg->header.prog == KEEPALIVE_PROGRAM &&
         msg->header.vers == KEEPALIVE_PROTOCOL_VERSION &&
index af9e7222972414e29fa4e9575564097a5e356f78..09264a5071fbd5762f7ba3715fd7f611536c5b2d 100644 (file)
@@ -51,6 +51,9 @@ int virKeepAliveStart(virKeepAlivePtr ka,
 void virKeepAliveStop(virKeepAlivePtr ka);
 void virKeepAliveStopSending(virKeepAlivePtr ka);
 
+int virKeepAliveTimeout(virKeepAlivePtr ka);
+bool virKeepAliveTrigger(virKeepAlivePtr ka,
+                         virNetMessagePtr *msg);
 bool virKeepAliveCheckMessage(virKeepAlivePtr ka,
                               virNetMessagePtr msg);