diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index bc49a2f30..6565c4aef 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -514,8 +514,19 @@ void ApiListener::ApiTimerHandler(void) lmessage->Set("method", "log::SetLogPosition"); lmessage->Set("params", lparams); - BOOST_FOREACH(const JsonRpcConnection::Ptr& client, endpoint->GetClients()) - client->SendMessage(lmessage); + double maxTs = 0; + + BOOST_FOREACH(const JsonRpcConnection::Ptr& client, endpoint->GetClients()) { + if (client->GetTimestamp() > maxTs) + maxTs = client->GetTimestamp(); + } + + BOOST_FOREACH(const JsonRpcConnection::Ptr& client, endpoint->GetClients()) { + if (client->GetTimestamp() != maxTs) + client->Disconnect(); + else + client->SendMessage(lmessage); + } Log(LogNotice, "ApiListener") << "Setting log position for identity '" << endpoint->GetName() << "': " @@ -580,8 +591,19 @@ void ApiListener::SyncSendMessage(const Endpoint::Ptr& endpoint, const Dictionar Log(LogNotice, "ApiListener") << "Sending message to '" << endpoint->GetName() << "'"; - BOOST_FOREACH(const JsonRpcConnection::Ptr& client, endpoint->GetClients()) + double maxTs = 0; + + BOOST_FOREACH(const JsonRpcConnection::Ptr& client, endpoint->GetClients()) { + if (client->GetTimestamp() > maxTs) + maxTs = client->GetTimestamp(); + } + + BOOST_FOREACH(const JsonRpcConnection::Ptr& client, endpoint->GetClients()) { + if (client->GetTimestamp() != maxTs) + continue; + client->SendMessage(message); + } } } diff --git a/lib/remote/jsonrpcconnection.cpp b/lib/remote/jsonrpcconnection.cpp index 0a095c9fd..a209788eb 100644 --- a/lib/remote/jsonrpcconnection.cpp +++ b/lib/remote/jsonrpcconnection.cpp @@ -41,7 +41,7 @@ static Timer::Ptr l_JsonRpcConnectionTimeoutTimer; JsonRpcConnection::JsonRpcConnection(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_Role(role), m_Timestamp(Utility::GetTime()), m_Seen(Utility::GetTime()), m_NextHeartbeat(0), m_HeartbeatTimeout(0) { boost::call_once(l_JsonRpcConnectionOnceFlag, &JsonRpcConnection::StaticInitialize); @@ -66,6 +66,11 @@ void JsonRpcConnection::Start(void) DataAvailableHandler(); } +double JsonRpcConnection::GetTimestamp(void) const +{ + return m_Timestamp; +} + String JsonRpcConnection::GetIdentity(void) const { return m_Identity; diff --git a/lib/remote/jsonrpcconnection.hpp b/lib/remote/jsonrpcconnection.hpp index 083b1d177..1e514e8b4 100644 --- a/lib/remote/jsonrpcconnection.hpp +++ b/lib/remote/jsonrpcconnection.hpp @@ -57,6 +57,7 @@ public: void Start(void); + double GetTimestamp(void) const; String GetIdentity(void) const; bool IsAuthenticated(void) const; Endpoint::Ptr GetEndpoint(void) const; @@ -76,6 +77,7 @@ private: Endpoint::Ptr m_Endpoint; TlsStream::Ptr m_Stream; ConnectionRole m_Role; + double m_Timestamp; double m_Seen; double m_NextHeartbeat; double m_HeartbeatTimeout;