]> granicus.if.org Git - icinga2/commitdiff
Ensure that program status updates are immediately updated in DB IDO
authorMichael Friedrich <michael.friedrich@netways.de>
Wed, 11 May 2016 12:03:40 +0000 (14:03 +0200)
committerMichael Friedrich <michael.friedrich@netways.de>
Wed, 11 May 2016 12:03:40 +0000 (14:03 +0200)
fixes #11767

lib/db_ido/dbconnection.cpp
lib/db_ido/dbconnection.hpp
lib/db_ido/dbquery.hpp
lib/db_ido_mysql/idomysqlconnection.cpp
lib/db_ido_pgsql/idopgsqlconnection.cpp

index 694b9e37f5999edb2d6c4285efd5439886b4fb87..c7995c8f214ac3c632164d8f059a132e08c0e141 100644 (file)
@@ -146,7 +146,7 @@ void DbConnection::InitializeDbTimer(void)
 {
        m_ProgramStatusTimer = new Timer();
        m_ProgramStatusTimer->SetInterval(10);
-       m_ProgramStatusTimer->OnTimerExpired.connect(boost::bind(&DbConnection::ProgramStatusHandler));
+       m_ProgramStatusTimer->OnTimerExpired.connect(boost::bind(&DbConnection::UpdateProgramStatus));
        m_ProgramStatusTimer->Start();
 }
 
@@ -163,7 +163,7 @@ void DbConnection::InsertRuntimeVariable(const String& key, const Value& value)
        DbObject::OnQuery(query);
 }
 
-void DbConnection::ProgramStatusHandler(void)
+void DbConnection::UpdateProgramStatus(void)
 {
        Log(LogNotice, "DbConnection")
             << "Updating programstatus table.";
@@ -206,15 +206,19 @@ void DbConnection::ProgramStatusHandler(void)
        query2.Priority = PriorityHigh;
        queries.push_back(query2);
 
+       DbQuery query3;
+       query3.Type = DbQueryNewTransaction;
+       queries.push_back(query3);
+
        DbObject::OnMultipleQueries(queries);
 
-       DbQuery query3;
-       query3.Table = "runtimevariables";
-       query3.Type = DbQueryDelete;
-       query3.Category = DbCatProgramStatus;
-       query3.WhereCriteria = new Dictionary();
-       query3.WhereCriteria->Set("instance_id", 0);  /* DbConnection class fills in real ID */
-       DbObject::OnQuery(query3);
+       DbQuery query4;
+       query4.Table = "runtimevariables";
+       query4.Type = DbQueryDelete;
+       query4.Category = DbCatProgramStatus;
+       query4.WhereCriteria = new Dictionary();
+       query4.WhereCriteria->Set("instance_id", 0);  /* DbConnection class fills in real ID */
+       DbObject::OnQuery(query4);
 
        InsertRuntimeVariable("total_services", std::distance(ConfigType::GetObjectsByType<Service>().first, ConfigType::GetObjectsByType<Service>().second));
        InsertRuntimeVariable("total_scheduled_services", std::distance(ConfigType::GetObjectsByType<Service>().first, ConfigType::GetObjectsByType<Service>().second));
index 6f81178f7176cb141871fd0bdf1c6e84c4fecf99..94b1af485ae948190de24909e2f41fcbc05b5bdc 100644 (file)
@@ -95,6 +95,8 @@ protected:
 
        void IncreaseQueryCount(void);
 
+       static void UpdateProgramStatus(void);
+
 private:
        std::map<DbObject::Ptr, DbReference> m_ObjectIDs;
        std::map<std::pair<DbType::Ptr, DbReference>, DbReference> m_InsertIDs;
@@ -114,7 +116,6 @@ private:
        void StatsLoggerTimerHandler(void);
 
        static void InsertRuntimeVariable(const String& key, const Value& value);
-       static void ProgramStatusHandler(void);
 
        mutable boost::mutex m_StatsMutex;
        RingBuffer m_QueryStats;
index 1dd2d4318c41755ac19548231723bed952a8c1f7..3161d1c1b506ddf042e0ace7488091a760ec410d 100644 (file)
@@ -33,7 +33,8 @@ enum DbQueryType
 {
        DbQueryInsert = 1,
        DbQueryUpdate = 2,
-       DbQueryDelete = 4
+       DbQueryDelete = 4,
+       DbQueryNewTransaction = 8
 };
 
 enum DbQueryCategory
index 1d2317d34c71626c1d98e933471e6d9b36d7cfc8..20af6a4f670bbe0234135f466b5fd69da209176a 100644 (file)
@@ -356,6 +356,9 @@ void IdoMysqlConnection::Reconnect(void)
        /* set session time zone to utc */
        Query("SET SESSION TIME_ZONE='+00:00'");
 
+       /* update programstatus table */
+       UpdateProgramStatus();
+
        /* record connection */
        Query("INSERT INTO " + GetTablePrefix() + "conninfo " +
            "(instance_id, connect_time, last_checkin_time, agent_name, agent_version, connect_type, data_start_time) VALUES ("
@@ -837,7 +840,7 @@ void IdoMysqlConnection::InternalExecuteMultipleQueries(const std::vector<DbQuer
                return;
 
        BOOST_FOREACH(const DbQuery& query, queries) {
-               ASSERT(query.Category != DbCatInvalid);
+               ASSERT(query.Type == DbQueryNewTransaction || query.Category != DbCatInvalid);
 
                if (!CanExecuteQuery(query)) {
                        m_QueryQueue.Enqueue(boost::bind(&IdoMysqlConnection::InternalExecuteMultipleQueries, this, queries), query.Priority);
@@ -854,10 +857,15 @@ void IdoMysqlConnection::InternalExecuteQuery(const DbQuery& query, DbQueryType
 {
        AssertOnWorkQueue();
 
-       if ((query.Category & GetCategories()) == 0)
+       if (!GetConnected())
                return;
 
-       if (!GetConnected())
+       if (query.Type == DbQueryNewTransaction) {
+               InternalNewTransaction();
+               return;
+       }
+
+       if ((query.Category & GetCategories()) == 0)
                return;
 
        if (query.Object && query.Object->GetObject()->GetExtension("agent_check").ToBool())
index a55f5fa647f09b94e024aba079bace04d9d5fd98..93f72f9d11e0004da59c8936787a7f25dd9c2fea 100644 (file)
@@ -324,6 +324,9 @@ void IdoPgsqlConnection::Reconnect(void)
        Log(LogInformation, "IdoPgsqlConnection")
            << "pgSQL IDO instance id: " << static_cast<long>(m_InstanceID) << " (schema version: '" + version + "')";
 
+       /* update programstatus table */
+       UpdateProgramStatus();
+
        /* record connection */
        Query("INSERT INTO " + GetTablePrefix() + "conninfo " +
            "(instance_id, connect_time, last_checkin_time, agent_name, agent_version, connect_type, data_start_time) VALUES ("
@@ -697,7 +700,7 @@ void IdoPgsqlConnection::InternalExecuteMultipleQueries(const std::vector<DbQuer
                return;
 
        BOOST_FOREACH(const DbQuery& query, queries) {
-               ASSERT(query.Category != DbCatInvalid);
+               ASSERT(query.Type == DbQueryNewTransaction || query.Category != DbCatInvalid);
 
                if (!CanExecuteQuery(query)) {
                        m_QueryQueue.Enqueue(boost::bind(&IdoPgsqlConnection::InternalExecuteMultipleQueries, this, queries), query.Priority);
@@ -714,10 +717,15 @@ void IdoPgsqlConnection::InternalExecuteQuery(const DbQuery& query, DbQueryType
 {
        AssertOnWorkQueue();
 
-       if ((query.Category & GetCategories()) == 0)
+       if (!GetConnected())
                return;
 
-       if (!GetConnected())
+       if (query.Type == DbQueryNewTransaction) {
+               InternalNewTransaction();
+               return;
+       }
+
+       if ((query.Category & GetCategories()) == 0)
                return;
 
        if (query.Object && query.Object->GetObject()->GetExtension("agent_check").ToBool())