Merge pull request #9480 from Icinga/9478-2.13

IcingaDB::SendCustomVarsChanged(): don't delete custom vars of not synced types
This commit is contained in:
Alexander Aleksandrovič Klimov 2022-08-10 22:01:23 +02:00 committed by GitHub
commit a8a05b5e6d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 0 deletions

View File

@ -16,6 +16,7 @@ improves logging and updates a bundled library.
* Ensure not to write an incomplete (i.e. corrupt) state file. #9467 * Ensure not to write an incomplete (i.e. corrupt) state file. #9467
* ITL: Render vars.apt\_upgrade=true as --upgrade, not --upgrade=true. #9458 * ITL: Render vars.apt\_upgrade=true as --upgrade, not --upgrade=true. #9458
* Icinga DB: Don't surprise (and crash) the Go daemon with config types it doesn't know. #9480
* Icinga DB: Add missing Redis SELinux policy. #9473 * Icinga DB: Add missing Redis SELinux policy. #9473
* Windows: Don't spam the event log with non-error startup messages. #9457 * Windows: Don't spam the event log with non-error startup messages. #9457
* Windows: Update bundled version of OpenSSL. #9460 * Windows: Update bundled version of OpenSSL. #9460

View File

@ -44,6 +44,8 @@ using namespace icinga;
using Prio = RedisConnection::QueryPriority; using Prio = RedisConnection::QueryPriority;
std::unordered_set<Type*> IcingaDB::m_IndexedTypes;
INITIALIZE_ONCE(&IcingaDB::ConfigStaticInitialize); INITIALIZE_ONCE(&IcingaDB::ConfigStaticInitialize);
std::vector<Type::Ptr> IcingaDB::GetTypes() std::vector<Type::Ptr> IcingaDB::GetTypes()
@ -74,6 +76,10 @@ std::vector<Type::Ptr> IcingaDB::GetTypes()
void IcingaDB::ConfigStaticInitialize() void IcingaDB::ConfigStaticInitialize()
{ {
for (auto& type : GetTypes()) {
m_IndexedTypes.emplace(type.get());
}
/* triggered in ProcessCheckResult(), requires UpdateNextCheck() to be called before */ /* triggered in ProcessCheckResult(), requires UpdateNextCheck() to be called before */
Checkable::OnStateChange.connect([](const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, StateType type, const MessageOrigin::Ptr&) { Checkable::OnStateChange.connect([](const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, StateType type, const MessageOrigin::Ptr&) {
IcingaDB::StateChangeHandler(checkable, cr, type); IcingaDB::StateChangeHandler(checkable, cr, type);
@ -2511,6 +2517,10 @@ void IcingaDB::SendCommandArgumentsChanged(const ConfigObject::Ptr& command, con
} }
void IcingaDB::SendCustomVarsChanged(const ConfigObject::Ptr& object, const Dictionary::Ptr& oldValues, const Dictionary::Ptr& newValues) { void IcingaDB::SendCustomVarsChanged(const ConfigObject::Ptr& object, const Dictionary::Ptr& oldValues, const Dictionary::Ptr& newValues) {
if (m_IndexedTypes.find(object->GetReflectionType().get()) == m_IndexedTypes.end()) {
return;
}
if (!m_Rcon || !m_Rcon->IsConnected() || oldValues == newValues) { if (!m_Rcon || !m_Rcon->IsConnected() || oldValues == newValues) {
return; return;
} }
@ -2715,6 +2725,10 @@ void IcingaDB::VersionChangedHandler(const ConfigObject::Ptr& object)
{ {
Type::Ptr type = object->GetReflectionType(); Type::Ptr type = object->GetReflectionType();
if (m_IndexedTypes.find(type.get()) == m_IndexedTypes.end()) {
return;
}
if (object->IsActive()) { if (object->IsActive()) {
// Create or update the object config // Create or update the object config
for (const IcingaDB::Ptr& rw : ConfigType::GetObjectsByType<IcingaDB>()) { for (const IcingaDB::Ptr& rw : ConfigType::GetObjectsByType<IcingaDB>()) {

View File

@ -21,6 +21,7 @@
#include <mutex> #include <mutex>
#include <set> #include <set>
#include <unordered_map> #include <unordered_map>
#include <unordered_set>
#include <utility> #include <utility>
namespace icinga namespace icinga
@ -232,6 +233,8 @@ private:
// initialization, the value is read-only and can be accessed without further synchronization. // initialization, the value is read-only and can be accessed without further synchronization.
static String m_EnvironmentId; static String m_EnvironmentId;
static std::mutex m_EnvironmentIdInitMutex; static std::mutex m_EnvironmentIdInitMutex;
static std::unordered_set<Type*> m_IndexedTypes;
}; };
} }