]> granicus.if.org Git - icinga2/commitdiff
Fix timeout problem with API heartbeat messages
authorGunnar Beutner <gunnar@beutner.name>
Wed, 11 Mar 2015 11:53:43 +0000 (12:53 +0100)
committerGunnar Beutner <gunnar@beutner.name>
Wed, 11 Mar 2015 11:56:22 +0000 (12:56 +0100)
fixes #8672

lib/remote/apiclient-heartbeat.cpp
lib/remote/apiclient.cpp
lib/remote/apiclient.hpp

index 066a6102616b1600eb8e77599206a363f36c8ffe..bd7aad9f8ab0974d3a9304b91e46f3ec0273392d 100644 (file)
@@ -65,7 +65,7 @@ void ApiClient::HeartbeatTimerHandler(void)
                        request->Set("method", "event::Heartbeat");
 
                        Dictionary::Ptr params = new Dictionary();
-                       params->Set("timeout", 30);
+                       params->Set("timeout", 120);
 
                        request->Set("params", params);
 
@@ -78,8 +78,10 @@ Value ApiClient::HeartbeatAPIHandler(const MessageOrigin& origin, const Dictiona
 {
        Value vtimeout = params->Get("timeout");
 
-       if (!vtimeout.IsEmpty())
+       if (!vtimeout.IsEmpty()) {
                origin.FromClient->m_NextHeartbeat = Utility::GetTime() + vtimeout;
+               origin.FromClient->m_HeartbeatTimeout = vtimeout;
+       }
 
        return Empty;
 }
index da4d51eb1181a3950705c250dcfa226a584be159..b5662433e0df2c15484fd5561d4a6e8adf227f5f 100644 (file)
@@ -40,7 +40,7 @@ static Timer::Ptr l_ApiClientTimeoutTimer;
 
 ApiClient::ApiClient(const String& identity, bool authenticated, const TlsStream::Ptr& stream, ConnectionRole role)
        : m_Identity(identity), m_Authenticated(authenticated), m_Stream(stream), m_Role(role), m_Seen(Utility::GetTime()),
-         m_NextHeartbeat(0), m_Context(false)
+         m_NextHeartbeat(0), m_HeartbeatTimeout(0), m_Context(false)
 {
        boost::call_once(l_ApiClientOnceFlag, &ApiClient::StaticInitialize);
 
@@ -136,6 +136,9 @@ bool ApiClient::ProcessMessage(void)
 
        m_Seen = Utility::GetTime();
 
+       if (m_HeartbeatTimeout != 0)
+               m_NextHeartbeat = Utility::GetTime() + m_HeartbeatTimeout;
+
        if (m_Endpoint && message->Contains("ts")) {
                double ts = message->Get("ts");
 
index b65efdcc81bce24c1558449404a3c5eff76786f1..80199f1c4fe19981012e2aa196224796f832eb4a 100644 (file)
@@ -72,6 +72,7 @@ private:
        ConnectionRole m_Role;
        double m_Seen;
        double m_NextHeartbeat;
+       double m_HeartbeatTimeout;
        Timer::Ptr m_TimeoutTimer;
 
        StreamReadContext m_Context;