mirror of https://github.com/Icinga/icinga2.git
Merge pull request #7936 from Icinga/bugfix/config-sync-failed-reload-7742
ApiListener::ConfigUpdateHandler(): make the whole process mutually exclusive
This commit is contained in:
commit
2e22ceb23e
|
@ -10,9 +10,11 @@
|
||||||
#include "base/convert.hpp"
|
#include "base/convert.hpp"
|
||||||
#include "base/application.hpp"
|
#include "base/application.hpp"
|
||||||
#include "base/exception.hpp"
|
#include "base/exception.hpp"
|
||||||
|
#include "base/shared.hpp"
|
||||||
#include "base/utility.hpp"
|
#include "base/utility.hpp"
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
using namespace icinga;
|
using namespace icinga;
|
||||||
|
|
||||||
|
@ -310,10 +312,16 @@ Value ApiListener::ConfigUpdateHandler(const MessageOrigin::Ptr& origin, const D
|
||||||
return Empty;
|
return Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::thread([origin, params]() { HandleConfigUpdate(origin, params); }).detach();
|
||||||
|
return Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApiListener::HandleConfigUpdate(const MessageOrigin::Ptr& origin, const Dictionary::Ptr& params)
|
||||||
|
{
|
||||||
/* Only one transaction is allowed, concurrent message handlers need to wait.
|
/* Only one transaction is allowed, concurrent message handlers need to wait.
|
||||||
* This affects two parent endpoints sending the config in the same moment.
|
* This affects two parent endpoints sending the config in the same moment.
|
||||||
*/
|
*/
|
||||||
boost::mutex::scoped_lock lock(m_ConfigSyncStageLock);
|
auto lock (Shared<boost::mutex::scoped_lock>::Make(m_ConfigSyncStageLock));
|
||||||
|
|
||||||
String apiZonesStageDir = GetApiZonesStageDir();
|
String apiZonesStageDir = GetApiZonesStageDir();
|
||||||
String fromEndpointName = origin->FromClient->GetEndpoint()->GetName();
|
String fromEndpointName = origin->FromClient->GetEndpoint()->GetName();
|
||||||
|
@ -521,14 +529,12 @@ Value ApiListener::ConfigUpdateHandler(const MessageOrigin::Ptr& origin, const D
|
||||||
Log(LogInformation, "ApiListener")
|
Log(LogInformation, "ApiListener")
|
||||||
<< "Received configuration updates (" << count << ") from endpoint '" << fromEndpointName
|
<< "Received configuration updates (" << count << ") from endpoint '" << fromEndpointName
|
||||||
<< "' are different to production, triggering validation and reload.";
|
<< "' are different to production, triggering validation and reload.";
|
||||||
AsyncTryActivateZonesStage(relativePaths);
|
AsyncTryActivateZonesStage(relativePaths, lock);
|
||||||
} else {
|
} else {
|
||||||
Log(LogInformation, "ApiListener")
|
Log(LogInformation, "ApiListener")
|
||||||
<< "Received configuration updates (" << count << ") from endpoint '" << fromEndpointName
|
<< "Received configuration updates (" << count << ") from endpoint '" << fromEndpointName
|
||||||
<< "' are equal to production, skipping validation and reload.";
|
<< "' are equal to production, skipping validation and reload.";
|
||||||
}
|
}
|
||||||
|
|
||||||
return Empty;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -612,7 +618,7 @@ void ApiListener::TryActivateZonesStageCallback(const ProcessResult& pr,
|
||||||
*
|
*
|
||||||
* @param relativePaths Required for later file operations in the callback. Provides the zone name plus path in a list.
|
* @param relativePaths Required for later file operations in the callback. Provides the zone name plus path in a list.
|
||||||
*/
|
*/
|
||||||
void ApiListener::AsyncTryActivateZonesStage(const std::vector<String>& relativePaths)
|
void ApiListener::AsyncTryActivateZonesStage(const std::vector<String>& relativePaths, const Shared<boost::mutex::scoped_lock>::Ptr& lock)
|
||||||
{
|
{
|
||||||
VERIFY(Application::GetArgC() >= 1);
|
VERIFY(Application::GetArgC() >= 1);
|
||||||
|
|
||||||
|
@ -638,7 +644,10 @@ void ApiListener::AsyncTryActivateZonesStage(const std::vector<String>& relative
|
||||||
|
|
||||||
Process::Ptr process = new Process(Process::PrepareCommand(args));
|
Process::Ptr process = new Process(Process::PrepareCommand(args));
|
||||||
process->SetTimeout(Application::GetReloadTimeout());
|
process->SetTimeout(Application::GetReloadTimeout());
|
||||||
process->Run(std::bind(&TryActivateZonesStageCallback, _1, relativePaths));
|
|
||||||
|
process->Run([relativePaths, lock](const ProcessResult& pr) {
|
||||||
|
TryActivateZonesStageCallback(pr, relativePaths);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -85,6 +85,7 @@ public:
|
||||||
|
|
||||||
/* filesync */
|
/* filesync */
|
||||||
static Value ConfigUpdateHandler(const MessageOrigin::Ptr& origin, const Dictionary::Ptr& params);
|
static Value ConfigUpdateHandler(const MessageOrigin::Ptr& origin, const Dictionary::Ptr& params);
|
||||||
|
static void HandleConfigUpdate(const MessageOrigin::Ptr& origin, const Dictionary::Ptr& params);
|
||||||
|
|
||||||
/* configsync */
|
/* configsync */
|
||||||
static void ConfigUpdateObjectHandler(const ConfigObject::Ptr& object, const Value& cookie);
|
static void ConfigUpdateObjectHandler(const ConfigObject::Ptr& object, const Value& cookie);
|
||||||
|
@ -199,7 +200,7 @@ private:
|
||||||
|
|
||||||
static void TryActivateZonesStageCallback(const ProcessResult& pr,
|
static void TryActivateZonesStageCallback(const ProcessResult& pr,
|
||||||
const std::vector<String>& relativePaths);
|
const std::vector<String>& relativePaths);
|
||||||
static void AsyncTryActivateZonesStage(const std::vector<String>& relativePaths);
|
static void AsyncTryActivateZonesStage(const std::vector<String>& relativePaths, const Shared<boost::mutex::scoped_lock>::Ptr& lock);
|
||||||
|
|
||||||
static String GetChecksum(const String& content);
|
static String GetChecksum(const String& content);
|
||||||
static bool CheckConfigChange(const ConfigDirInformation& oldConfig, const ConfigDirInformation& newConfig);
|
static bool CheckConfigChange(const ConfigDirInformation& oldConfig, const ConfigDirInformation& newConfig);
|
||||||
|
|
Loading…
Reference in New Issue