From: Gunnar Beutner Date: Fri, 2 Aug 2013 13:45:50 +0000 (+0200) Subject: Fix: Separately keep track of whether we've completed config and status updates. X-Git-Tag: v0.0.3~749 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0af63930333f49b050dc993458d3dddbf02324d2;p=icinga2 Fix: Separately keep track of whether we've completed config and status updates. --- diff --git a/components/ido_mysql/mysqldbconnection.cpp b/components/ido_mysql/mysqldbconnection.cpp index 3af6e450d..333c079c4 100644 --- a/components/ido_mysql/mysqldbconnection.cpp +++ b/components/ido_mysql/mysqldbconnection.cpp @@ -281,6 +281,9 @@ void MysqlDbConnection::DeactivateObject(const DbObject::Ptr& dbobj) std::ostringstream qbuf; qbuf << "UPDATE " + GetTablePrefix() + "objects SET is_active = 0 WHERE object_id = " << static_cast(dbref); Query(qbuf.str()); + + /* Note that we're _NOT_ clearing the db refs via SetReference/SetConfigUpdate/SetStatusUpdate + * because the object is still in the database. */ } /* caller must hold m_ConnectionMutex */ @@ -368,9 +371,18 @@ void MysqlDbConnection::ExecuteQuery(const DbQuery& query) } if ((query.Type & DbQueryInsert) && (query.Type & DbQueryUpdate)) { + bool hasid; + ASSERT(query.Object); - if (GetInsertID(query.Object).IsValid()) + if (query.ConfigUpdate) + hasid = GetConfigUpdate(query.Object); + else if (query.StatusUpdate) + hasid = GetStatusUpdate(query.Object); + else + ASSERT(!"Invalid query flags."); + + if (hasid) type = DbQueryUpdate; else { if (query.WhereCriteria) @@ -436,6 +448,13 @@ void MysqlDbConnection::ExecuteQuery(const DbQuery& query) Query(qbuf.str()); - if (type == DbQueryInsert && query.Object && query.UpdateObjectID) - SetInsertID(query.Object, GetLastInsertID()); + if (query.Object) { + if (query.ConfigUpdate) + SetConfigUpdate(query.Object, true); + else if (query.StatusUpdate) + SetStatusUpdate(query.Object, true); + + if (type == DbQueryInsert && query.ConfigUpdate) + SetInsertID(query.Object, GetLastInsertID()); + } } diff --git a/lib/ido/dbconnection.cpp b/lib/ido/dbconnection.cpp index 35768e53f..62e3d7894 100644 --- a/lib/ido/dbconnection.cpp +++ b/lib/ido/dbconnection.cpp @@ -131,6 +131,31 @@ DbReference DbConnection::GetInsertID(const DbObject::Ptr& dbobj) const return it->second; } +void DbConnection::SetConfigUpdate(const DbObject::Ptr& dbobj, bool hasupdate) +{ + if (hasupdate) + m_ConfigUpdates.insert(dbobj); + else + m_ConfigUpdates.erase(dbobj); +} + +bool DbConnection::GetConfigUpdate(const DbObject::Ptr& dbobj) const +{ + return (m_ConfigUpdates.find(dbobj) != m_ConfigUpdates.end()); +} + +void DbConnection::SetStatusUpdate(const DbObject::Ptr& dbobj, bool hasupdate) +{ + if (hasupdate) + m_StatusUpdates.insert(dbobj); + else + m_StatusUpdates.erase(dbobj); +} + +bool DbConnection::GetStatusUpdate(const DbObject::Ptr& dbobj) const +{ + return (m_StatusUpdates.find(dbobj) != m_StatusUpdates.end()); +} void DbConnection::ExecuteQuery(const DbQuery&) { diff --git a/lib/ido/dbconnection.h b/lib/ido/dbconnection.h index 0a7949ca4..35b3aca4c 100644 --- a/lib/ido/dbconnection.h +++ b/lib/ido/dbconnection.h @@ -48,6 +48,12 @@ public: void SetInsertID(const DbObject::Ptr& dbobj, const DbReference& dbref); DbReference GetInsertID(const DbObject::Ptr& dbobj) const; + void SetConfigUpdate(const DbObject::Ptr& dbobj, bool hasupdate); + bool GetConfigUpdate(const DbObject::Ptr& dbobj) const; + + void SetStatusUpdate(const DbObject::Ptr& dbobj, bool hasupdate); + bool GetStatusUpdate(const DbObject::Ptr& dbobj) const; + String GetTablePrefix(void) const; protected: @@ -64,6 +70,8 @@ private: std::map m_ObjectIDs; std::map m_InsertIDs; + std::set m_ConfigUpdates; + std::set m_StatusUpdates; static Timer::Ptr m_ProgramStatusTimer; static void ProgramStatusHandler(void); diff --git a/lib/ido/dbobject.cpp b/lib/ido/dbobject.cpp index 4f12c5242..2fc45385d 100644 --- a/lib/ido/dbobject.cpp +++ b/lib/ido/dbobject.cpp @@ -89,7 +89,7 @@ void DbObject::SendConfigUpdate(void) query.WhereCriteria = boost::make_shared(); query.WhereCriteria->Set(GetType()->GetIDColumn(), GetObject()); query.Object = GetSelf(); - query.UpdateObjectID = true; + query.ConfigUpdate = true; OnQuery(query); m_LastConfigUpdate = Utility::GetTime(); @@ -114,7 +114,7 @@ void DbObject::SendStatusUpdate(void) query.WhereCriteria = boost::make_shared(); query.WhereCriteria->Set(GetType()->GetIDColumn(), GetObject()); query.Object = GetSelf(); - query.UpdateObjectID = false; + query.StatusUpdate = true; OnQuery(query); m_LastStatusUpdate = Utility::GetTime(); diff --git a/lib/ido/dbquery.h b/lib/ido/dbquery.h index 71b88825e..a91ce70dc 100644 --- a/lib/ido/dbquery.h +++ b/lib/ido/dbquery.h @@ -41,7 +41,12 @@ struct DbQuery Dictionary::Ptr Fields; Dictionary::Ptr WhereCriteria; boost::shared_ptr Object; - bool UpdateObjectID; + bool ConfigUpdate; + bool StatusUpdate; + + DbQuery(void) + : Type(0), ConfigUpdate(false), StatusUpdate(false) + { } }; }