Ensure that config sync updates are always sent on reconnect

fixes #11083
This commit is contained in:
Michael Friedrich 2016-02-04 11:30:27 +01:00
parent caf3380e73
commit 949b129c65
2 changed files with 21 additions and 11 deletions

View File

@ -339,11 +339,6 @@ void ApiListener::NewClientHandlerInternal(const Socket::Ptr& client, const Stri
<< "New client connection (no client certificate)"; << "New client connection (no client certificate)";
} }
bool need_sync = false;
if (endpoint)
need_sync = !endpoint->GetConnected();
ClientType ctype; ClientType ctype;
if (role == RoleClient) { if (role == RoleClient) {
@ -377,10 +372,11 @@ void ApiListener::NewClientHandlerInternal(const Socket::Ptr& client, const Stri
aclient->Start(); aclient->Start();
if (endpoint) { if (endpoint) {
bool needSync = !endpoint->GetConnected();
endpoint->AddClient(aclient); endpoint->AddClient(aclient);
if (need_sync) m_SyncQueue.Enqueue(boost::bind(&ApiListener::SyncClient, this, aclient, endpoint, needSync));
m_SyncQueue.Enqueue(boost::bind(&ApiListener::SyncClient, this, aclient, endpoint));
} else } else
AddAnonymousClient(aclient); AddAnonymousClient(aclient);
} else { } 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 { try {
{ {
@ -401,8 +397,12 @@ void ApiListener::SyncClient(const JsonRpcConnection::Ptr& aclient, const Endpoi
endpoint->SetSyncing(true); endpoint->SetSyncing(true);
} }
/* Make sure that the config updates are synced
* before the logs are replayed.
*/
Log(LogInformation, "ApiListener") Log(LogInformation, "ApiListener")
<< "Sending updates for endpoint '" << endpoint->GetName() << "'."; << "Sending config updates for endpoint '" << endpoint->GetName() << "'.";
/* sync zone file config */ /* sync zone file config */
SendConfigUpdate(aclient); SendConfigUpdate(aclient);
@ -410,9 +410,19 @@ void ApiListener::SyncClient(const JsonRpcConnection::Ptr& aclient, const Endpoi
SendRuntimeConfigObjects(aclient); SendRuntimeConfigObjects(aclient);
Log(LogInformation, "ApiListener") 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); ReplayLog(aclient);
Log(LogInformation, "ApiListener")
<< "Finished sending replay log for endpoint '" << endpoint->GetName() << "'.";
} catch (const std::exception& ex) { } catch (const std::exception& ex) {
Log(LogCritical, "ApiListener") Log(LogCritical, "ApiListener")
<< "Error while syncing endpoint '" << endpoint->GetName() << "': " << DiagnosticInformation(ex); << "Error while syncing endpoint '" << endpoint->GetName() << "': " << DiagnosticInformation(ex);

View File

@ -156,7 +156,7 @@ private:
const JsonRpcConnection::Ptr& client = JsonRpcConnection::Ptr()); const JsonRpcConnection::Ptr& client = JsonRpcConnection::Ptr());
void SendRuntimeConfigObjects(const JsonRpcConnection::Ptr& aclient); 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);
}; };
} }