From ea1f8727da7f09303af1e725492b1fb84f76fdb1 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 5 Oct 2016 13:13:26 +0200 Subject: [PATCH] Implement GetAllChildren() for dependency resolution refs #10896 refs #10897 --- lib/icinga/checkable-dependency.cpp | 30 +++++++++++++++++++++++++ lib/icinga/checkable.hpp | 3 +++ lib/icinga/externalcommandprocessor.cpp | 4 ++-- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/lib/icinga/checkable-dependency.cpp b/lib/icinga/checkable-dependency.cpp index 8f1d46542..7d47cfb4f 100644 --- a/lib/icinga/checkable-dependency.cpp +++ b/lib/icinga/checkable-dependency.cpp @@ -128,3 +128,33 @@ std::set Checkable::GetChildren(void) const return parents; } + +std::set Checkable::GetAllChildren(void) const +{ + std::set children = GetChildren(); + + GetAllChildrenInternal(children, 0); + + return children; +} + +void Checkable::GetAllChildrenInternal(std::set& children, int level) const +{ + if (level > 32) + return; + + std::set localChildren; + + for (const Checkable::Ptr& checkable : children) { + std::set cChildren = checkable->GetChildren(); + + if (!checkable->GetChildren().empty()) { + GetAllChildrenInternal(cChildren, level + 1); + localChildren.insert(cChildren.begin(), cChildren.end()); + } + + localChildren.insert(checkable); + } + + children.insert(localChildren.begin(), localChildren.end()); +} diff --git a/lib/icinga/checkable.hpp b/lib/icinga/checkable.hpp index db15fcae9..fe4f237c6 100644 --- a/lib/icinga/checkable.hpp +++ b/lib/icinga/checkable.hpp @@ -74,6 +74,7 @@ public: std::set GetParents(void) const; std::set GetChildren(void) const; + std::set GetAllChildren(void) const; void AddGroup(const String& name); @@ -217,6 +218,8 @@ private: mutable boost::mutex m_DependencyMutex; std::set > m_Dependencies; std::set > m_ReverseDependencies; + + void GetAllChildrenInternal(std::set& children, int level = 0) const; }; } diff --git a/lib/icinga/externalcommandprocessor.cpp b/lib/icinga/externalcommandprocessor.cpp index 68b24b018..637f7b432 100644 --- a/lib/icinga/externalcommandprocessor.cpp +++ b/lib/icinga/externalcommandprocessor.cpp @@ -1024,7 +1024,7 @@ void ExternalCommandProcessor::ScheduleAndPropagateHostDowntime(double, const st Convert::ToBool(is_fixed), triggeredBy, Convert::ToDouble(arguments[5])); /* Schedule downtime for all child hosts */ - BOOST_FOREACH(const Checkable::Ptr& child, host->GetChildren()) { + for (const Checkable::Ptr& child : host->GetAllChildren()) { Host::Ptr host; Service::Ptr service; tie(host, service) = GetHostService(child); @@ -1060,7 +1060,7 @@ void ExternalCommandProcessor::ScheduleAndPropagateTriggeredHostDowntime(double, Convert::ToBool(is_fixed), triggeredBy, Convert::ToDouble(arguments[5])); /* Schedule downtime for all child hosts and explicitely trigger them through the parent host's downtime */ - BOOST_FOREACH(const Checkable::Ptr& child, host->GetChildren()) { + for (const Checkable::Ptr& child : host->GetAllChildren()) { Host::Ptr host; Service::Ptr service; tie(host, service) = GetHostService(child);