mirror of
https://github.com/Icinga/icinga2.git
synced 2025-07-26 15:14:07 +02:00
Avoid dead-lock with config packages and active stages
This commit is contained in:
parent
736e0806d7
commit
704aabcb63
@ -85,7 +85,8 @@ bool ConfigObjectUtility::CreateObject(const Type::Ptr& type, const String& full
|
|||||||
const String& config, const Array::Ptr& errors, const Array::Ptr& diagnosticInformation)
|
const String& config, const Array::Ptr& errors, const Array::Ptr& diagnosticInformation)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(ConfigPackageUtility::GetStaticMutex());
|
boost::mutex::scoped_lock lock(ConfigPackageUtility::GetStaticPackageMutex());
|
||||||
|
|
||||||
if (!ConfigPackageUtility::PackageExists("_api")) {
|
if (!ConfigPackageUtility::PackageExists("_api")) {
|
||||||
ConfigPackageUtility::CreatePackage("_api");
|
ConfigPackageUtility::CreatePackage("_api");
|
||||||
|
|
||||||
|
@ -63,7 +63,8 @@ void ConfigPackagesHandler::HandleGet(
|
|||||||
ArrayData results;
|
ArrayData results;
|
||||||
|
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(ConfigPackageUtility::GetStaticMutex());
|
boost::mutex::scoped_lock lock(ConfigPackageUtility::GetStaticPackageMutex());
|
||||||
|
|
||||||
for (const String& package : packages) {
|
for (const String& package : packages) {
|
||||||
results.emplace_back(new Dictionary({
|
results.emplace_back(new Dictionary({
|
||||||
{ "name", package },
|
{ "name", package },
|
||||||
@ -104,7 +105,8 @@ void ConfigPackagesHandler::HandlePost(
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
boost::mutex::scoped_lock lock(ConfigPackageUtility::GetStaticMutex());
|
boost::mutex::scoped_lock lock(ConfigPackageUtility::GetStaticPackageMutex());
|
||||||
|
|
||||||
ConfigPackageUtility::CreatePackage(packageName);
|
ConfigPackageUtility::CreatePackage(packageName);
|
||||||
} catch (const std::exception& ex) {
|
} catch (const std::exception& ex) {
|
||||||
HttpUtility::SendJsonError(response, params, 500, "Could not create package '" + packageName + "'.",
|
HttpUtility::SendJsonError(response, params, 500, "Could not create package '" + packageName + "'.",
|
||||||
|
@ -186,7 +186,8 @@ void ConfigPackageUtility::TryActivateStageCallback(const ProcessResult& pr, con
|
|||||||
/* validation went fine, activate stage and reload */
|
/* validation went fine, activate stage and reload */
|
||||||
if (pr.ExitStatus == 0) {
|
if (pr.ExitStatus == 0) {
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(GetStaticMutex());
|
boost::mutex::scoped_lock lock(GetStaticPackageMutex());
|
||||||
|
|
||||||
ActivateStage(packageName, stageName);
|
ActivateStage(packageName, stageName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -251,7 +252,7 @@ std::vector<String> ConfigPackageUtility::GetStages(const String& packageName)
|
|||||||
String ConfigPackageUtility::GetActiveStageFromFile(const String& packageName)
|
String ConfigPackageUtility::GetActiveStageFromFile(const String& packageName)
|
||||||
{
|
{
|
||||||
/* Lock the transaction, reading this only happens on startup or when something really is broken. */
|
/* Lock the transaction, reading this only happens on startup or when something really is broken. */
|
||||||
boost::mutex::scoped_lock lock(GetStaticMutex());
|
boost::mutex::scoped_lock lock(GetStaticActiveStageMutex());
|
||||||
|
|
||||||
String path = GetPackageDir() + "/" + packageName + "/active-stage";
|
String path = GetPackageDir() + "/" + packageName + "/active-stage";
|
||||||
|
|
||||||
@ -271,7 +272,7 @@ String ConfigPackageUtility::GetActiveStageFromFile(const String& packageName)
|
|||||||
|
|
||||||
void ConfigPackageUtility::SetActiveStageToFile(const String& packageName, const String& stageName)
|
void ConfigPackageUtility::SetActiveStageToFile(const String& packageName, const String& stageName)
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(GetStaticMutex());
|
boost::mutex::scoped_lock lock(GetStaticActiveStageMutex());
|
||||||
|
|
||||||
String activeStagePath = GetPackageDir() + "/" + packageName + "/active-stage";
|
String activeStagePath = GetPackageDir() + "/" + packageName + "/active-stage";
|
||||||
|
|
||||||
@ -380,7 +381,13 @@ bool ConfigPackageUtility::ValidateName(const String& name)
|
|||||||
return (!boost::regex_search(name.GetData(), what, expr));
|
return (!boost::regex_search(name.GetData(), what, expr));
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::mutex& ConfigPackageUtility::GetStaticMutex()
|
boost::mutex& ConfigPackageUtility::GetStaticPackageMutex()
|
||||||
|
{
|
||||||
|
static boost::mutex mutex;
|
||||||
|
return mutex;
|
||||||
|
}
|
||||||
|
|
||||||
|
boost::mutex& ConfigPackageUtility::GetStaticActiveStageMutex()
|
||||||
{
|
{
|
||||||
static boost::mutex mutex;
|
static boost::mutex mutex;
|
||||||
return mutex;
|
return mutex;
|
||||||
|
@ -44,7 +44,8 @@ public:
|
|||||||
static bool ContainsDotDot(const String& path);
|
static bool ContainsDotDot(const String& path);
|
||||||
static bool ValidateName(const String& name);
|
static bool ValidateName(const String& name);
|
||||||
|
|
||||||
static boost::mutex& GetStaticMutex();
|
static boost::mutex& GetStaticPackageMutex();
|
||||||
|
static boost::mutex& GetStaticActiveStageMutex();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void CollectDirNames(const String& path, std::vector<String>& dirs);
|
static void CollectDirNames(const String& path, std::vector<String>& dirs);
|
||||||
|
@ -120,7 +120,8 @@ void ConfigStagesHandler::HandlePost(
|
|||||||
if (!files)
|
if (!files)
|
||||||
BOOST_THROW_EXCEPTION(std::invalid_argument("Parameter 'files' must be specified."));
|
BOOST_THROW_EXCEPTION(std::invalid_argument("Parameter 'files' must be specified."));
|
||||||
|
|
||||||
boost::mutex::scoped_lock lock(ConfigPackageUtility::GetStaticMutex());
|
boost::mutex::scoped_lock lock(ConfigPackageUtility::GetStaticPackageMutex());
|
||||||
|
|
||||||
stageName = ConfigPackageUtility::CreateStage(packageName, files);
|
stageName = ConfigPackageUtility::CreateStage(packageName, files);
|
||||||
|
|
||||||
/* validate the config. on success, activate stage and reload */
|
/* validate the config. on success, activate stage and reload */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user