Fix timeout problem with API heartbeat messages

fixes #8672
This commit is contained in:
Gunnar Beutner 2015-03-11 12:53:43 +01:00
parent 21522f9ed6
commit cef5191d44
3 changed files with 9 additions and 3 deletions

View File

@ -65,7 +65,7 @@ void ApiClient::HeartbeatTimerHandler(void)
request->Set("method", "event::Heartbeat"); request->Set("method", "event::Heartbeat");
Dictionary::Ptr params = new Dictionary(); Dictionary::Ptr params = new Dictionary();
params->Set("timeout", 30); params->Set("timeout", 120);
request->Set("params", params); request->Set("params", params);
@ -78,8 +78,10 @@ Value ApiClient::HeartbeatAPIHandler(const MessageOrigin& origin, const Dictiona
{ {
Value vtimeout = params->Get("timeout"); Value vtimeout = params->Get("timeout");
if (!vtimeout.IsEmpty()) if (!vtimeout.IsEmpty()) {
origin.FromClient->m_NextHeartbeat = Utility::GetTime() + vtimeout; origin.FromClient->m_NextHeartbeat = Utility::GetTime() + vtimeout;
origin.FromClient->m_HeartbeatTimeout = vtimeout;
}
return Empty; return Empty;
} }

View File

@ -40,7 +40,7 @@ static Timer::Ptr l_ApiClientTimeoutTimer;
ApiClient::ApiClient(const String& identity, bool authenticated, const TlsStream::Ptr& stream, ConnectionRole role) 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_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); boost::call_once(l_ApiClientOnceFlag, &ApiClient::StaticInitialize);
@ -136,6 +136,9 @@ bool ApiClient::ProcessMessage(void)
m_Seen = Utility::GetTime(); m_Seen = Utility::GetTime();
if (m_HeartbeatTimeout != 0)
m_NextHeartbeat = Utility::GetTime() + m_HeartbeatTimeout;
if (m_Endpoint && message->Contains("ts")) { if (m_Endpoint && message->Contains("ts")) {
double ts = message->Get("ts"); double ts = message->Get("ts");

View File

@ -72,6 +72,7 @@ private:
ConnectionRole m_Role; ConnectionRole m_Role;
double m_Seen; double m_Seen;
double m_NextHeartbeat; double m_NextHeartbeat;
double m_HeartbeatTimeout;
Timer::Ptr m_TimeoutTimer; Timer::Ptr m_TimeoutTimer;
StreamReadContext m_Context; StreamReadContext m_Context;