From: Michael Friedrich Date: Thu, 4 Feb 2016 10:30:27 +0000 (+0100) Subject: Ensure that config sync updates are always sent on reconnect X-Git-Tag: v2.5.0~558 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=949b129c65fcf13261dbdf494e2263f126d72808;p=icinga2 Ensure that config sync updates are always sent on reconnect fixes #11083 --- diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 6cad26bbb..37d373034 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -339,11 +339,6 @@ void ApiListener::NewClientHandlerInternal(const Socket::Ptr& client, const Stri << "New client connection (no client certificate)"; } - bool need_sync = false; - - if (endpoint) - need_sync = !endpoint->GetConnected(); - ClientType ctype; if (role == RoleClient) { @@ -377,10 +372,11 @@ void ApiListener::NewClientHandlerInternal(const Socket::Ptr& client, const Stri aclient->Start(); if (endpoint) { + bool needSync = !endpoint->GetConnected(); + endpoint->AddClient(aclient); - if (need_sync) - m_SyncQueue.Enqueue(boost::bind(&ApiListener::SyncClient, this, aclient, endpoint)); + m_SyncQueue.Enqueue(boost::bind(&ApiListener::SyncClient, this, aclient, endpoint, needSync)); } else AddAnonymousClient(aclient); } else { @@ -392,7 +388,7 @@ void ApiListener::NewClientHandlerInternal(const Socket::Ptr& client, const Stri } } -void ApiListener::SyncClient(const JsonRpcConnection::Ptr& aclient, const Endpoint::Ptr& endpoint) +void ApiListener::SyncClient(const JsonRpcConnection::Ptr& aclient, const Endpoint::Ptr& endpoint, bool needSync) { try { { @@ -401,8 +397,12 @@ void ApiListener::SyncClient(const JsonRpcConnection::Ptr& aclient, const Endpoi endpoint->SetSyncing(true); } + /* Make sure that the config updates are synced + * before the logs are replayed. + */ + Log(LogInformation, "ApiListener") - << "Sending updates for endpoint '" << endpoint->GetName() << "'."; + << "Sending config updates for endpoint '" << endpoint->GetName() << "'."; /* sync zone file config */ SendConfigUpdate(aclient); @@ -410,9 +410,19 @@ void ApiListener::SyncClient(const JsonRpcConnection::Ptr& aclient, const Endpoi SendRuntimeConfigObjects(aclient); Log(LogInformation, "ApiListener") - << "Finished sending updates for endpoint '" << endpoint->GetName() << "'."; + << "Finished sending config updates for endpoint '" << endpoint->GetName() << "'."; + + if (!needSync) + return; + + Log(LogInformation, "ApiListener") + << "Sending replay log for endpoint '" << endpoint->GetName() << "'."; ReplayLog(aclient); + + Log(LogInformation, "ApiListener") + << "Finished sending replay log for endpoint '" << endpoint->GetName() << "'."; + } catch (const std::exception& ex) { Log(LogCritical, "ApiListener") << "Error while syncing endpoint '" << endpoint->GetName() << "': " << DiagnosticInformation(ex); diff --git a/lib/remote/apilistener.hpp b/lib/remote/apilistener.hpp index bfc2f2d7a..4c860f89b 100644 --- a/lib/remote/apilistener.hpp +++ b/lib/remote/apilistener.hpp @@ -156,7 +156,7 @@ private: const JsonRpcConnection::Ptr& client = JsonRpcConnection::Ptr()); void SendRuntimeConfigObjects(const JsonRpcConnection::Ptr& aclient); - void SyncClient(const JsonRpcConnection::Ptr& aclient, const Endpoint::Ptr& endpoint); + void SyncClient(const JsonRpcConnection::Ptr& aclient, const Endpoint::Ptr& endpoint, bool needSync); }; }