]> granicus.if.org Git - icinga2/commitdiff
Make sure the dependency graph is properly updated when adding and removing objects
authorGunnar Beutner <gunnar.beutner@netways.de>
Mon, 9 May 2016 11:48:30 +0000 (13:48 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Mon, 9 May 2016 12:30:12 +0000 (14:30 +0200)
fixes #11686
fixes #11374

lib/base/dependencygraph.cpp
lib/icinga/comment.ti
lib/icinga/dependency.ti
lib/icinga/downtime.ti
lib/icinga/notification.ti
lib/icinga/scheduleddowntime.ti
tools/mkclass/classcompiler.cpp

index 6f1053c88aee79c22bac77dcb7f22678aa756e10..037830d56f800257da2b35f4da4d23cd18553277 100644 (file)
@@ -34,7 +34,20 @@ void DependencyGraph::AddDependency(Object *parent, Object *child)
 void DependencyGraph::RemoveDependency(Object *parent, Object *child)
 {
        boost::mutex::scoped_lock lock(m_Mutex);
-       m_Dependencies[child][parent]--;
+
+       std::map<Object *, int>& refs = m_Dependencies[child];
+       std::map<Object *, int>::iterator it = refs.find(parent);
+
+       if (it == refs.end())
+               return;
+
+       it->second--;
+
+       if (it->second == 0)
+               refs.erase(it);
+
+       if (refs.empty())
+               m_Dependencies.erase(child);
 }
 
 std::vector<Object::Ptr> DependencyGraph::GetParents(const Object::Ptr& child)
index 8ac497aac2dea2a721da0fa4cf45151208746f49..94ad48ebb0bc76851e1c359b44db691813704cc7 100644 (file)
@@ -67,7 +67,7 @@ class Comment : ConfigObject < CommentNameComposer
 
                        if (!newValue.IsEmpty()) {
                                Service::Ptr service = Service::GetByNamePair(GetHostName(), newValue);
-                               DependencyGraph::RemoveDependency(this, service.get());
+                               DependencyGraph::AddDependency(this, service.get());
                        }
                }}}
                navigate {{{
index aeb943fc7c5e3389ad02d5b9dfb3d8a0686a8bc7..fbbb8246cf416a8a06800c487b08b77ef6d049fa 100644 (file)
@@ -55,7 +55,7 @@ class Dependency : CustomVarObject < DependencyNameComposer
 
                        if (!newValue.IsEmpty()) {
                                Service::Ptr service = Service::GetByNamePair(GetParentHostName(), newValue);
-                               DependencyGraph::RemoveDependency(this, service.get());
+                               DependencyGraph::AddDependency(this, service.get());
                        }
                }}}
                navigate {{{
@@ -82,7 +82,7 @@ class Dependency : CustomVarObject < DependencyNameComposer
 
                        if (!newValue.IsEmpty()) {
                                Service::Ptr service = Service::GetByNamePair(GetParentHostName(), newValue);
-                               DependencyGraph::RemoveDependency(this, service.get());
+                               DependencyGraph::AddDependency(this, service.get());
                        }
                }}}
                navigate {{{
index d5a16988aafb2e005453dfef632ab4134013524b..5c7a19bdd55eca588fe944f9ee38b37ebf7d211f 100644 (file)
@@ -54,7 +54,7 @@ class Downtime : ConfigObject < DowntimeNameComposer
 
                        if (!newValue.IsEmpty()) {
                                Service::Ptr service = Service::GetByNamePair(GetHostName(), newValue);
-                               DependencyGraph::RemoveDependency(this, service.get());
+                               DependencyGraph::AddDependency(this, service.get());
                        }
                }}}
                navigate {{{
index c8825b31a89ef9e51fa923115caf52647a7e26b6..18604e2e9d557be7840c461b8bb53c252a90cb53 100644 (file)
@@ -74,7 +74,7 @@ class Notification : CustomVarObject < NotificationNameComposer
 
                        if (!newValue.IsEmpty()) {
                                Service::Ptr service = Service::GetByNamePair(GetHostName(), newValue);
-                               DependencyGraph::RemoveDependency(this, service.get());
+                               DependencyGraph::AddDependency(this, service.get());
                        }
                }}}
                navigate {{{
index 4b95ae60c11cb50e86024130c5c871014aeb1c33..92b5e465956db172e616c3f9c9062e4c3b629239 100644 (file)
@@ -53,7 +53,7 @@ class ScheduledDowntime : CustomVarObject < ScheduledDowntimeNameComposer
 
                        if (!newValue.IsEmpty()) {
                                Service::Ptr service = Service::GetByNamePair(GetHostName(), newValue);
-                               DependencyGraph::RemoveDependency(this, service.get());
+                               DependencyGraph::AddDependency(this, service.get());
                        }
                }}}
                navigate {{{
index c15b3e12adae73591894ace1d85a2b71c1358d1f..4c7136437d3467d02610a1c4460e70420c614fcc 100644 (file)
@@ -901,7 +901,7 @@ void ClassCompiler::HandleClass(const Klass& klass, const ClassDebugInfo&)
                               << "\t" << klass.Parent << "::Start(runtimeCreated);" << std::endl << std::endl;
 
                        for (it = klass.Fields.begin(); it != klass.Fields.end(); it++) {
-                               if (!(it->Type.IsName))
+                               if (!it->Type.IsName && it->TrackAccessor.empty())
                                        continue;
 
                                m_Impl << "\t" << "Track" << it->GetFriendlyName() << "(Empty, Get" << it->GetFriendlyName() << "());" << std::endl;
@@ -913,7 +913,7 @@ void ClassCompiler::HandleClass(const Klass& klass, const ClassDebugInfo&)
                               << "\t" << klass.Parent << "::Stop(runtimeRemoved);" << std::endl << std::endl;
 
                        for (it = klass.Fields.begin(); it != klass.Fields.end(); it++) {
-                               if (!(it->Type.IsName))
+                               if (!it->Type.IsName && it->TrackAccessor.empty())
                                        continue;
 
                                m_Impl << "\t" << "Track" << it->GetFriendlyName() << "(Get" << it->GetFriendlyName() << "(), Empty);" << std::endl;