From 8f53835c11ab5cf0785f982cf09ba169b4c8681f Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 25 Jan 2016 10:57:06 +0100 Subject: [PATCH] Make sure we only have one connection per satellite refs #11014 --- lib/remote/apilistener.cpp | 28 +++++++++++++++++++++++++--- lib/remote/jsonrpcconnection.cpp | 7 ++++++- lib/remote/jsonrpcconnection.hpp | 2 ++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 747f709b7..5f5961d12 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -520,8 +520,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() << "': " @@ -586,8 +597,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 ae514dfab..49191f938 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; -- 2.40.0