diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index 9dccd5c27..ff9b1a266 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -215,10 +215,6 @@ void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrig ResetNotificationNumbers(); SaveLastState(ServiceOK, cr->GetExecutionEnd()); - - /* update reachability for child objects in OK state */ - if (!children.empty()) - OnReachabilityChanged(this, cr, children, origin); } else { /* OK -> NOT-OK change, first SOFT state. Reset attempt counter. */ if (IsStateOK(old_state)) { @@ -241,10 +237,6 @@ void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrig if (!IsStateOK(cr->GetState())) { SaveLastState(cr->GetState(), cr->GetExecutionEnd()); } - - /* update reachability for child objects in NOT-OK state */ - if (!children.empty()) - OnReachabilityChanged(this, cr, children, origin); } if (recovery) { @@ -514,6 +506,10 @@ void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrig SetSuppressedNotifications(suppressed_types_after); } } + + /* update reachability for child objects */ + if ((stateChange || hardChange) && !children.empty()) + OnReachabilityChanged(this, cr, children, origin); } void Checkable::ExecuteRemoteCheck(const Dictionary::Ptr& resolvedMacros) diff --git a/lib/icingadb/icingadb-objects.cpp b/lib/icingadb/icingadb-objects.cpp index 4ad678687..c4e1b1da7 100644 --- a/lib/icingadb/icingadb-objects.cpp +++ b/lib/icingadb/icingadb-objects.cpp @@ -84,6 +84,10 @@ void IcingaDB::ConfigStaticInitialize() AcknowledgementClearedHandler(checkable, removedBy, changeTime); }); + Checkable::OnReachabilityChanged.connect([](const Checkable::Ptr&, const CheckResult::Ptr&, std::set children, const MessageOrigin::Ptr&) { + IcingaDB::ReachabilityChangeHandler(children); + }); + /* triggered on create, update and delete objects */ ConfigObject::OnActiveChanged.connect([](const ConfigObject::Ptr& object, const Value&) { IcingaDB::VersionChangedHandler(object); @@ -2598,6 +2602,15 @@ void IcingaDB::StateChangeHandler(const ConfigObject::Ptr& object, const CheckRe } } +void IcingaDB::ReachabilityChangeHandler(const std::set& children) +{ + for (const IcingaDB::Ptr& rw : ConfigType::GetObjectsByType()) { + for (auto& checkable : children) { + rw->UpdateState(checkable, StateUpdate::Full); + } + } +} + void IcingaDB::VersionChangedHandler(const ConfigObject::Ptr& object) { Type::Ptr type = object->GetReflectionType(); diff --git a/lib/icingadb/icingadb.hpp b/lib/icingadb/icingadb.hpp index 0ea003a34..91e0bb45e 100644 --- a/lib/icingadb/icingadb.hpp +++ b/lib/icingadb/icingadb.hpp @@ -136,6 +136,7 @@ private: static String GetLowerCaseTypeNameDB(const ConfigObject::Ptr& obj); static bool PrepareObject(const ConfigObject::Ptr& object, Dictionary::Ptr& attributes, Dictionary::Ptr& checkSums); + static void ReachabilityChangeHandler(const std::set& children); static void StateChangeHandler(const ConfigObject::Ptr& object, const CheckResult::Ptr& cr, StateType type); static void VersionChangedHandler(const ConfigObject::Ptr& object); static void DowntimeStartedHandler(const Downtime::Ptr& downtime);