Implement timeout for anonymous ApiClient objects.

Refs #6107
This commit is contained in:
Gunnar Beutner 2014-05-08 15:12:56 +02:00
parent bd610a74b1
commit 87bcb168d7
3 changed files with 52 additions and 6 deletions

View File

@ -102,6 +102,10 @@ void ApiClient::Disconnect(void)
if (m_Endpoint)
m_Endpoint->RemoveClient(GetSelf());
else {
ApiListener::Ptr listener = ApiListener::GetInstance();
listener->RemoveAnonymousClient(GetSelf());
}
}
bool ApiClient::ProcessMessage(void)
@ -194,6 +198,21 @@ void ApiClient::KeepAliveTimerHandler(void)
}
}
}
ApiListener::Ptr listener = ApiListener::GetInstance();
if (listener) {
double timeout = now - 60;
BOOST_FOREACH(const ApiClient::Ptr& client, listener->GetAnonymousClients()) {
if (client->m_Seen < timeout) {
Log(LogInformation, "remote", "Closing connection with inactive anonymous endpoint '" + client->GetIdentity() + "'");
client->Disconnect();
}
}
}
}
Value SetLogPositionHandler(const MessageOrigin& origin, const Dictionary::Ptr& params)

View File

@ -205,12 +205,15 @@ void ApiListener::NewClientHandler(const Socket::Ptr& client, ConnectionRole rol
Endpoint::Ptr endpoint = Endpoint::GetByName(identity);
bool need_sync;
if (endpoint)
need_sync = !endpoint->IsConnected();
ApiClient::Ptr aclient = make_shared<ApiClient>(identity, tlsStream, role);
aclient->Start();
if (endpoint) {
bool need_sync = !endpoint->IsConnected();
ApiClient::Ptr aclient = make_shared<ApiClient>(identity, tlsStream, role);
aclient->Start();
if (need_sync) {
{
ObjectLock olock(endpoint);
@ -222,7 +225,8 @@ void ApiListener::NewClientHandler(const Socket::Ptr& client, ConnectionRole rol
}
endpoint->AddClient(aclient);
}
} else
AddAnonymousClient(aclient);
}
void ApiListener::ApiTimerHandler(void)
@ -645,3 +649,21 @@ std::pair<Dictionary::Ptr, Dictionary::Ptr> ApiListener::GetStatus(void)
return std::make_pair(status, perfdata);
}
void ApiListener::AddAnonymousClient(const ApiClient::Ptr& aclient)
{
ObjectLock olock(this);
m_AnonymousClients.insert(aclient);
}
void ApiListener::RemoveAnonymousClient(const ApiClient::Ptr& aclient)
{
ObjectLock olock(this);
m_AnonymousClients.erase(aclient);
}
std::set<ApiClient::Ptr> ApiListener::GetAnonymousClients(void) const
{
ObjectLock olock(this);
return m_AnonymousClients;
}

View File

@ -64,6 +64,10 @@ public:
static Value StatsFunc(Dictionary::Ptr& status, Dictionary::Ptr& perfdata);
std::pair<Dictionary::Ptr, Dictionary::Ptr> GetStatus(void);
void AddAnonymousClient(const ApiClient::Ptr& aclient);
void RemoveAnonymousClient(const ApiClient::Ptr& aclient);
std::set<ApiClient::Ptr> GetAnonymousClients(void) const;
protected:
virtual void OnConfigLoaded(void);
virtual void Start(void);
@ -71,6 +75,7 @@ protected:
private:
shared_ptr<SSL_CTX> m_SSLContext;
std::set<TcpSocket::Ptr> m_Servers;
std::set<ApiClient::Ptr> m_AnonymousClients;
Timer::Ptr m_Timer;
void ApiTimerHandler(void);