diff --git a/CHANGELOG.md b/CHANGELOG.md index 648b37030..367d24cd0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ improves logging and updates a bundled library. * Ensure not to write an incomplete (i.e. corrupt) state file. #9467 * 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 * Windows: Don't spam the event log with non-error startup messages. #9457 * Windows: Update bundled version of OpenSSL. #9460 diff --git a/lib/icingadb/icingadb-objects.cpp b/lib/icingadb/icingadb-objects.cpp index cce9bda02..f9533b483 100644 --- a/lib/icingadb/icingadb-objects.cpp +++ b/lib/icingadb/icingadb-objects.cpp @@ -44,6 +44,8 @@ using namespace icinga; using Prio = RedisConnection::QueryPriority; +std::unordered_set IcingaDB::m_IndexedTypes; + INITIALIZE_ONCE(&IcingaDB::ConfigStaticInitialize); std::vector IcingaDB::GetTypes() @@ -74,6 +76,10 @@ std::vector IcingaDB::GetTypes() void IcingaDB::ConfigStaticInitialize() { + for (auto& type : GetTypes()) { + m_IndexedTypes.emplace(type.get()); + } + /* 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&) { 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) { + if (m_IndexedTypes.find(object->GetReflectionType().get()) == m_IndexedTypes.end()) { + return; + } + if (!m_Rcon || !m_Rcon->IsConnected() || oldValues == newValues) { return; } @@ -2715,6 +2725,10 @@ void IcingaDB::VersionChangedHandler(const ConfigObject::Ptr& object) { Type::Ptr type = object->GetReflectionType(); + if (m_IndexedTypes.find(type.get()) == m_IndexedTypes.end()) { + return; + } + if (object->IsActive()) { // Create or update the object config for (const IcingaDB::Ptr& rw : ConfigType::GetObjectsByType()) { diff --git a/lib/icingadb/icingadb.hpp b/lib/icingadb/icingadb.hpp index c08f36465..21311453e 100644 --- a/lib/icingadb/icingadb.hpp +++ b/lib/icingadb/icingadb.hpp @@ -21,6 +21,7 @@ #include #include #include +#include #include namespace icinga @@ -232,6 +233,8 @@ private: // initialization, the value is read-only and can be accessed without further synchronization. static String m_EnvironmentId; static std::mutex m_EnvironmentIdInitMutex; + + static std::unordered_set m_IndexedTypes; }; }