-
Notifications
You must be signed in to change notification settings - Fork 574
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #10126 from Icinga/broken-runtime-config-sync-2.13
Fix broken runtime config sync
- Loading branch information
Showing
8 changed files
with
115 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
/* Icinga 2 | (c) 2022 Icinga GmbH | GPLv2+ */ | ||
|
||
#include "remote/configobjectslock.hpp" | ||
|
||
using namespace icinga; | ||
|
||
std::mutex ObjectNameLock::m_Mutex; | ||
std::condition_variable ObjectNameLock::m_CV; | ||
std::map<Type*, std::set<String>> ObjectNameLock::m_LockedObjectNames; | ||
|
||
/** | ||
* Locks the specified object name of the given type and unlocks it upon destruction of the instance of this class. | ||
* | ||
* If it is already locked, the call blocks until the lock is released. | ||
* | ||
* @param Type::Ptr ptype The type of the object you want to lock | ||
* @param String objName The object name you want to lock | ||
*/ | ||
ObjectNameLock::ObjectNameLock(const Type::Ptr& ptype, const String& objName): m_ObjectName{objName}, m_Type{ptype} | ||
{ | ||
std::unique_lock<std::mutex> lock(m_Mutex); | ||
m_CV.wait(lock, [this]{ | ||
auto& locked = m_LockedObjectNames[m_Type.get()]; | ||
return locked.find(m_ObjectName) == locked.end(); | ||
}); | ||
|
||
// Add the object name to the locked list to block all other threads that try | ||
// to process a message affecting the same object. | ||
m_LockedObjectNames[ptype.get()].emplace(objName); | ||
} | ||
|
||
ObjectNameLock::~ObjectNameLock() | ||
{ | ||
{ | ||
std::unique_lock<std::mutex> lock(m_Mutex); | ||
m_LockedObjectNames[m_Type.get()].erase(m_ObjectName); | ||
} | ||
m_CV.notify_all(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
/* Icinga 2 | (c) 2023 Icinga GmbH | GPLv2+ */ | ||
|
||
#pragma once | ||
|
||
#include "base/type.hpp" | ||
#include "base/string.hpp" | ||
#include <condition_variable> | ||
#include <map> | ||
#include <mutex> | ||
#include <set> | ||
|
||
namespace icinga | ||
{ | ||
|
||
/** | ||
* Allows you to easily lock/unlock a specific object of a given type by its name. | ||
* | ||
* That way, locking an object "this" of type Host does not affect an object "this" of | ||
* type "Service" nor an object "other" of type "Host". | ||
* | ||
* @ingroup remote | ||
*/ | ||
class ObjectNameLock | ||
{ | ||
public: | ||
ObjectNameLock(const Type::Ptr& ptype, const String& objName); | ||
|
||
~ObjectNameLock(); | ||
|
||
private: | ||
String m_ObjectName; | ||
Type::Ptr m_Type; | ||
|
||
static std::mutex m_Mutex; | ||
static std::condition_variable m_CV; | ||
static std::map<Type*, std::set<String>> m_LockedObjectNames; | ||
}; | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters