]> granicus.if.org Git - icinga2/commitdiff
Cache parent and child object for dependencies
authorGunnar Beutner <gunnar.beutner@netways.de>
Tue, 24 Jun 2014 09:46:53 +0000 (11:46 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Tue, 24 Jun 2014 09:46:53 +0000 (11:46 +0200)
fixes #6565

lib/icinga/dependency.cpp
lib/icinga/dependency.hpp

index e8d906e16cf29256b377c801535a1dc559e5e004..fc9dff2100d73c28f48d5c975c9733c2ecbc60b9 100644 (file)
@@ -62,15 +62,39 @@ void Dependency::OnStateLoaded(void)
 
        ASSERT(!OwnsLock());
 
-       if (!GetChild())
+       Host::Ptr childHost = Host::GetByName(GetChildHostName());
+
+       if (childHost) {
+               if (GetChildServiceName().IsEmpty()) {
+                       Log(LogDebug, "Dependency", "Dependency '" + GetName() + "' child host '" + GetChildHostName() + ".");
+                       m_Child = childHost;
+               } else {
+                       Log(LogDebug, "Dependency", "Dependency '" + GetName() + "' child host '" + GetChildHostName() + "' service '" + GetChildServiceName() + "' .");
+                       m_Child = childHost->GetServiceByShortName(GetChildServiceName());
+               }
+       }
+       
+       if (!m_Child)
                Log(LogWarning, "Dependency", "Dependency '" + GetName() + "' references an invalid child object and will be ignored.");
        else
-               GetChild()->AddDependency(GetSelf());
-
-       if (!GetParent())
+               m_Child->AddDependency(GetSelf());
+
+       Host::Ptr parentHost = Host::GetByName(GetParentHostName());
+
+       if (parentHost) {
+               if (GetParentServiceName().IsEmpty()) {
+                       Log(LogDebug, "Dependency", "Dependency '" + GetName() + "' parent host '" + GetParentHostName() + ".");
+                       m_Parent = parentHost;
+               } else {
+                       Log(LogDebug, "Dependency", "Dependency '" + GetName() + "' parent host '" + GetParentHostName() + "' service '" + GetParentServiceName() + "' .");
+                       m_Parent = parentHost->GetServiceByShortName(GetParentServiceName());
+               }
+       }
+       
+       if (!m_Parent)
                Log(LogWarning, "Dependency", "Dependency '" + GetName() + "' references an invalid parent object and will always fail.");
        else
-               GetParent()->AddReverseDependency(GetSelf());
+               m_Parent->AddReverseDependency(GetSelf());
 }
 
 void Dependency::Stop(void)
@@ -149,31 +173,12 @@ bool Dependency::IsAvailable(DependencyType dt) const
 
 Checkable::Ptr Dependency::GetChild(void) const
 {
-       Host::Ptr host = Host::GetByName(GetChildHostName());
-
-       if (!host)
-               return Service::Ptr();
-
-       if (GetChildServiceName().IsEmpty())
-               return host;
-       else
-               return host->GetServiceByShortName(GetChildServiceName());
+       return m_Child;
 }
 
 Checkable::Ptr Dependency::GetParent(void) const
 {
-       Host::Ptr host = Host::GetByName(GetParentHostName());
-
-       if (!host)
-               return Service::Ptr();
-
-       if (GetParentServiceName().IsEmpty()) {
-               Log(LogDebug, "Dependency", "Dependency '" + GetName() + "' parent host '" + GetParentHostName() + ".");
-               return host;
-       } else {
-               Log(LogDebug, "Dependency", "Dependency '" + GetName() + "' parent host '" + GetParentHostName() + "' service '" + GetParentServiceName() + "' .");
-               return host->GetServiceByShortName(GetParentServiceName());
-       }
+       return m_Parent;
 }
 
 TimePeriod::Ptr Dependency::GetPeriod(void) const
index 4d310c9563e5cd9a962ec7567f5166ea75fa5e77..08e04e81365c49544fb6a3649a1dbf6b115bf46c 100644 (file)
@@ -57,6 +57,9 @@ protected:
        virtual void Stop(void);
 
 private:
+       Checkable::Ptr m_Parent;
+       Checkable::Ptr m_Child;
+
        static bool EvaluateApplyRuleOne(const Checkable::Ptr& checkable, const ApplyRule& rule);
        static void EvaluateApplyRule(const ApplyRule& rule);
        static void EvaluateApplyRules(const std::vector<ApplyRule>& rules);