From ff0dabe287978f187eb982f4cffdbdf0028734ac Mon Sep 17 00:00:00 2001 From: Yonas Habteab Date: Wed, 4 Dec 2024 10:55:16 +0100 Subject: [PATCH] Checkable: Store dependencies grouped by their redundancy group --- lib/icinga/checkable-dependency.cpp | 19 +++++++++---------- lib/icinga/checkable.hpp | 4 +--- lib/icinga/dependency.cpp | 4 ++-- test/icinga-dependencies.cpp | 4 ++-- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/lib/icinga/checkable-dependency.cpp b/lib/icinga/checkable-dependency.cpp index 8a838a7d5..a176a10ad 100644 --- a/lib/icinga/checkable-dependency.cpp +++ b/lib/icinga/checkable-dependency.cpp @@ -27,22 +27,21 @@ void Checkable::RemoveDependencyGroup(const DependencyGroup::Ptr& dependencyGrou m_DependencyGroups.erase(dependencyGroup); } -void Checkable::AddDependency(const Dependency::Ptr& dep) +std::vector Checkable::GetDependencyGroups() const { - std::unique_lock lock(m_DependencyMutex); - m_Dependencies.insert(dep); -} - -void Checkable::RemoveDependency(const Dependency::Ptr& dep) -{ - std::unique_lock lock(m_DependencyMutex); - m_Dependencies.erase(dep); + std::lock_guard lock(m_DependencyMutex); + return {m_DependencyGroups.begin(), m_DependencyGroups.end()}; } std::vector Checkable::GetDependencies() const { std::unique_lock lock(m_DependencyMutex); - return std::vector(m_Dependencies.begin(), m_Dependencies.end()); + std::vector dependencies; + for (const auto& dependencyGroup : m_DependencyGroups) { + auto tmpDependencies(dependencyGroup->GetDependenciesForChild(this)); + dependencies.insert(dependencies.end(), tmpDependencies.begin(), tmpDependencies.end()); + } + return dependencies; } void Checkable::AddReverseDependency(const Dependency::Ptr& dep) diff --git a/lib/icinga/checkable.hpp b/lib/icinga/checkable.hpp index 39cc8f570..04c12d4f9 100644 --- a/lib/icinga/checkable.hpp +++ b/lib/icinga/checkable.hpp @@ -187,8 +187,7 @@ public: /* Dependencies */ void AddDependencyGroup(const intrusive_ptr& dependencyGroup); void RemoveDependencyGroup(const intrusive_ptr& dependencyGroup); - void AddDependency(const intrusive_ptr& dep); - void RemoveDependency(const intrusive_ptr& dep); + std::vector> GetDependencyGroups() const; std::vector > GetDependencies() const; void AddReverseDependency(const intrusive_ptr& dep); @@ -250,7 +249,6 @@ private: /* Dependencies */ mutable std::mutex m_DependencyMutex; std::set> m_DependencyGroups; - std::set > m_Dependencies; std::set > m_ReverseDependencies; void GetAllChildrenInternal(std::set& seenChildren, int level = 0) const; diff --git a/lib/icinga/dependency.cpp b/lib/icinga/dependency.cpp index a9a7bf372..2f2482136 100644 --- a/lib/icinga/dependency.cpp +++ b/lib/icinga/dependency.cpp @@ -251,7 +251,7 @@ void Dependency::OnAllConfigLoaded() // InitChildParentReferences() has to be called before. VERIFY(m_Child && m_Parent); - m_Child->AddDependency(this); + DependencyGroup::Register(this); m_Parent->AddReverseDependency(this); } @@ -259,7 +259,7 @@ void Dependency::Stop(bool runtimeRemoved) { ObjectImpl::Stop(runtimeRemoved); - GetChild()->RemoveDependency(this); + DependencyGroup::Unregister(this); GetParent()->RemoveReverseDependency(this); } diff --git a/test/icinga-dependencies.cpp b/test/icinga-dependencies.cpp index 929b6ca0d..86735cdb9 100644 --- a/test/icinga-dependencies.cpp +++ b/test/icinga-dependencies.cpp @@ -54,7 +54,7 @@ BOOST_AUTO_TEST_CASE(multi_parent) dep1->SetStateFilter(StateFilterUp); // Reverse dependencies - childHost->AddDependency(dep1); + DependencyGroup::Register(dep1); parentHost1->AddReverseDependency(dep1); Dependency::Ptr dep2 = new Dependency(); @@ -64,7 +64,7 @@ BOOST_AUTO_TEST_CASE(multi_parent) dep2->SetStateFilter(StateFilterUp); // Reverse dependencies - childHost->AddDependency(dep2); + DependencyGroup::Register(dep2); parentHost2->AddReverseDependency(dep2);