]> granicus.if.org Git - icinga2/commitdiff
Avoid duplicate IDO config updates at startup
authorGunnar Beutner <gunnar.beutner@netways.de>
Sat, 13 Aug 2016 20:54:22 +0000 (22:54 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Sat, 13 Aug 2016 21:31:22 +0000 (23:31 +0200)
fixes #12417

lib/base/serializer.cpp
lib/db_ido/dbconnection.cpp
lib/db_ido/dbconnection.hpp
lib/db_ido_mysql/idomysqlconnection.cpp
lib/db_ido_pgsql/idopgsqlconnection.cpp

index 92aaba92f7f7ef9c1804e22fe1cce538048c0442..770726a6a098df99e80c6326c39731fa71ffe9cf 100644 (file)
@@ -138,7 +138,7 @@ static Object::Ptr DeserializeObject(const Object::Ptr& object, const Dictionary
                        continue;
 
                try {
-                       instance->SetField(fid, Deserialize(kv.second, safe_mode, attributeTypes));
+                       instance->SetField(fid, Deserialize(kv.second, safe_mode, attributeTypes), true);
                } catch (const std::exception&) {
                        instance->SetField(fid, Empty);
                }
index e9f5ca0fbeb357836a0673723f0bd8bb78b66889..6f4af2da50bdd60c475e20163de6a873e03f20c2 100644 (file)
@@ -39,7 +39,8 @@ Timer::Ptr DbConnection::m_ProgramStatusTimer;
 boost::once_flag DbConnection::m_OnceFlag = BOOST_ONCE_INIT;
 
 DbConnection::DbConnection(void)
-       : m_QueryStats(15 * 60), m_PendingQueries(0), m_PendingQueriesTimestamp(0), m_IDCacheValid(false)
+       : m_QueryStats(15 * 60), m_PendingQueries(0), m_PendingQueriesTimestamp(0),
+         m_IDCacheValid(false), m_ActiveChangedHandler(false)
 { }
 
 void DbConnection::OnConfigLoaded(void)
@@ -74,7 +75,14 @@ void DbConnection::Start(bool runtimeCreated)
 
        DbObject::OnQuery.connect(boost::bind(&DbConnection::ExecuteQuery, this, _1));
        DbObject::OnMultipleQueries.connect(boost::bind(&DbConnection::ExecuteMultipleQueries, this, _1));
-       ConfigObject::OnActiveChanged.connect(boost::bind(&DbConnection::UpdateObject, this, _1));
+}
+
+void DbConnection::EnableActiveChangedHandler(void)
+{
+       if (!m_ActiveChangedHandler) {
+               ConfigObject::OnActiveChanged.connect(boost::bind(&DbConnection::UpdateObject, this, _1));
+               m_ActiveChangedHandler = true;
+       }
 }
 
 void DbConnection::StatsLoggerTimerHandler(void)
@@ -394,8 +402,10 @@ void DbConnection::UpdateObject(const ConfigObject::Ptr& object)
                bool dbActive = GetObjectActive(dbobj);
                bool active = object->IsActive();
 
-               if (active && !dbActive) {
-                       ActivateObject(dbobj);
+               if (active) {
+                       if (!dbActive)
+                               ActivateObject(dbobj);
+
                        dbobj->SendConfigUpdate();
                        dbobj->SendStatusUpdate();
                } else if (!active) {
index 84237199493eeb67e238759ca13788a377e5d8a0..74cc6b3e98dec1faf315c3b4ae90b4698bf2d188 100644 (file)
@@ -98,6 +98,8 @@ protected:
        bool IsIDCacheValid(void) const;
        void SetIDCacheValid(bool valid);
 
+       void EnableActiveChangedHandler(void);
+
        static void UpdateProgramStatus(void);
 
        static int GetSessionToken(void);
@@ -127,6 +129,7 @@ private:
        RingBuffer m_QueryStats;
        int m_PendingQueries;
        double m_PendingQueriesTimestamp;
+       bool m_ActiveChangedHandler;
 };
 
 struct database_error : virtual std::exception, virtual boost::exception { };
index 0c7165a696de509d70040f43f9b479bbfbb2c9f9..3bc8e89bcc2cae7acf9dffa0e3671025d7524cdc 100644 (file)
@@ -399,16 +399,16 @@ void IdoMysqlConnection::Reconnect(void)
 
        SetIDCacheValid(true);
 
+       EnableActiveChangedHandler();
+
        BOOST_FOREACH(const DbObject::Ptr& dbobj, activeDbObjs) {
-               if (dbobj->GetObject() == NULL) {
-                       Log(LogNotice, "IdoMysqlConnection")
-                           << "Deactivate deleted object name1: '" << dbobj->GetName1()
-                           << "' name2: '" << dbobj->GetName2() + "'.";
-                       DeactivateObject(dbobj);
-               } else {
-                       dbobj->SendConfigUpdate();
-                       dbobj->SendStatusUpdate();
-               }
+               if (dbobj->GetObject())
+                       continue;
+
+               Log(LogNotice, "IdoMysqlConnection")
+                   << "Deactivate deleted object name1: '" << dbobj->GetName1()
+                   << "' name2: '" << dbobj->GetName2() + "'.";
+               DeactivateObject(dbobj);
        }
 
        UpdateAllObjects();
index 55e2b98bda35702589e08487f412d0732d3e8c5d..9cc124232ec3cf58b988e3d0b2db0e08362ffbd9 100644 (file)
@@ -372,16 +372,16 @@ void IdoPgsqlConnection::Reconnect(void)
 
        SetIDCacheValid(true);
 
+       EnableActiveChangedHandler();
+
        BOOST_FOREACH(const DbObject::Ptr& dbobj, activeDbObjs) {
-               if (dbobj->GetObject() == NULL) {
-                       Log(LogNotice, "IdoPgsqlConnection")
-                           << "Deactivate deleted object name1: '" << dbobj->GetName1()
-                           << "' name2: '" << dbobj->GetName2() + "'.";
-                       DeactivateObject(dbobj);
-               } else {
-                       dbobj->SendConfigUpdate();
-                       dbobj->SendStatusUpdate();
-               }
+               if (dbobj->GetObject())
+                       continue;
+
+               Log(LogNotice, "IdoPgsqlConnection")
+                   << "Deactivate deleted object name1: '" << dbobj->GetName1()
+                   << "' name2: '" << dbobj->GetName2() + "'.";
+               DeactivateObject(dbobj);
        }
 
        UpdateAllObjects();