mirror of https://github.com/Icinga/icinga2.git
Avoid duplicate entries in the icinga_objects table for commands
refs #12147
This commit is contained in:
parent
3f852f118b
commit
959e2501aa
|
@ -28,9 +28,7 @@
|
||||||
|
|
||||||
using namespace icinga;
|
using namespace icinga;
|
||||||
|
|
||||||
REGISTER_DBTYPE(CheckCommand, "command", DbObjectTypeCommand, "object_id", CommandDbObject);
|
REGISTER_DBTYPE(Command, "command", DbObjectTypeCommand, "object_id", CommandDbObject);
|
||||||
REGISTER_DBTYPE(EventCommand, "command", DbObjectTypeCommand, "object_id", CommandDbObject);
|
|
||||||
REGISTER_DBTYPE(NotificationCommand, "command", DbObjectTypeCommand, "object_id", CommandDbObject);
|
|
||||||
|
|
||||||
CommandDbObject::CommandDbObject(const DbType::Ptr& type, const String& name1, const String& name2)
|
CommandDbObject::CommandDbObject(const DbType::Ptr& type, const String& name1, const String& name2)
|
||||||
: DbObject(type, name1, name2)
|
: DbObject(type, name1, name2)
|
||||||
|
|
|
@ -39,7 +39,7 @@ Timer::Ptr DbConnection::m_ProgramStatusTimer;
|
||||||
boost::once_flag DbConnection::m_OnceFlag = BOOST_ONCE_INIT;
|
boost::once_flag DbConnection::m_OnceFlag = BOOST_ONCE_INIT;
|
||||||
|
|
||||||
DbConnection::DbConnection(void)
|
DbConnection::DbConnection(void)
|
||||||
: m_QueryStats(15 * 60), m_PendingQueries(0), m_PendingQueriesTimestamp(0)
|
: m_QueryStats(15 * 60), m_PendingQueries(0), m_PendingQueriesTimestamp(0), m_IDCacheValid(false)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
void DbConnection::OnConfigLoaded(void)
|
void DbConnection::OnConfigLoaded(void)
|
||||||
|
@ -352,6 +352,8 @@ bool DbConnection::GetObjectActive(const DbObject::Ptr& dbobj) const
|
||||||
|
|
||||||
void DbConnection::ClearIDCache(void)
|
void DbConnection::ClearIDCache(void)
|
||||||
{
|
{
|
||||||
|
SetIDCacheValid(false);
|
||||||
|
|
||||||
m_ObjectIDs.clear();
|
m_ObjectIDs.clear();
|
||||||
m_InsertIDs.clear();
|
m_InsertIDs.clear();
|
||||||
m_ActiveObjects.clear();
|
m_ActiveObjects.clear();
|
||||||
|
@ -484,3 +486,13 @@ int DbConnection::GetQueryCount(RingBuffer::SizeType span) const
|
||||||
boost::mutex::scoped_lock lock(m_StatsMutex);
|
boost::mutex::scoped_lock lock(m_StatsMutex);
|
||||||
return m_QueryStats.GetValues(span);
|
return m_QueryStats.GetValues(span);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DbConnection::IsIDCacheValid(void) const
|
||||||
|
{
|
||||||
|
return m_IDCacheValid;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DbConnection::SetIDCacheValid(bool valid)
|
||||||
|
{
|
||||||
|
m_IDCacheValid = valid;
|
||||||
|
}
|
||||||
|
|
|
@ -95,9 +95,13 @@ protected:
|
||||||
|
|
||||||
void IncreaseQueryCount(void);
|
void IncreaseQueryCount(void);
|
||||||
|
|
||||||
|
bool IsIDCacheValid(void) const;
|
||||||
|
void SetIDCacheValid(bool valid);
|
||||||
|
|
||||||
static void UpdateProgramStatus(void);
|
static void UpdateProgramStatus(void);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool m_IDCacheValid;
|
||||||
std::map<DbObject::Ptr, DbReference> m_ObjectIDs;
|
std::map<DbObject::Ptr, DbReference> m_ObjectIDs;
|
||||||
std::map<std::pair<DbType::Ptr, DbReference>, DbReference> m_InsertIDs;
|
std::map<std::pair<DbType::Ptr, DbReference>, DbReference> m_InsertIDs;
|
||||||
std::set<DbObject::Ptr> m_ActiveObjects;
|
std::set<DbObject::Ptr> m_ActiveObjects;
|
||||||
|
|
|
@ -58,8 +58,15 @@ void DbType::RegisterType(const DbType::Ptr& type)
|
||||||
|
|
||||||
DbType::Ptr DbType::GetByName(const String& name)
|
DbType::Ptr DbType::GetByName(const String& name)
|
||||||
{
|
{
|
||||||
|
String typeName;
|
||||||
|
|
||||||
|
if (name == "CheckCommand" || name == "NotificationCommand" || name == "EventCommand")
|
||||||
|
typeName = "Command";
|
||||||
|
else
|
||||||
|
typeName = name;
|
||||||
|
|
||||||
boost::mutex::scoped_lock lock(GetStaticMutex());
|
boost::mutex::scoped_lock lock(GetStaticMutex());
|
||||||
DbType::TypeMap::const_iterator it = GetTypes().find(name);
|
DbType::TypeMap::const_iterator it = GetTypes().find(typeName);
|
||||||
|
|
||||||
if (it == GetTypes().end())
|
if (it == GetTypes().end())
|
||||||
return DbType::Ptr();
|
return DbType::Ptr();
|
||||||
|
@ -96,7 +103,22 @@ DbObject::Ptr DbType::GetOrCreateObjectByName(const String& name1, const String&
|
||||||
if (!name2.IsEmpty())
|
if (!name2.IsEmpty())
|
||||||
objName += "!" + name2;
|
objName += "!" + name2;
|
||||||
|
|
||||||
dbobj->SetObject(ConfigObject::GetObject(m_Name, objName));
|
String objType = m_Name;
|
||||||
|
|
||||||
|
if (m_TypeID == DbObjectTypeCommand) {
|
||||||
|
if (objName.SubStr(0, 6) == "check_") {
|
||||||
|
objType = "CheckCommand";
|
||||||
|
objName = objName.SubStr(6);
|
||||||
|
} else if (objName.SubStr(0, 13) == "notification_") {
|
||||||
|
objType = "NotificationCommand";
|
||||||
|
objName = objName.SubStr(13);
|
||||||
|
} else if (objName.SubStr(0, 6) == "event_") {
|
||||||
|
objType = "EventCommand";
|
||||||
|
objName = objName.SubStr(6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dbobj->SetObject(ConfigObject::GetObject(objType, objName));
|
||||||
|
|
||||||
return dbobj;
|
return dbobj;
|
||||||
}
|
}
|
||||||
|
|
|
@ -398,6 +398,8 @@ void IdoMysqlConnection::Reconnect(void)
|
||||||
activeDbObjs.push_back(dbobj);
|
activeDbObjs.push_back(dbobj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SetIDCacheValid(true);
|
||||||
|
|
||||||
BOOST_FOREACH(const DbObject::Ptr& dbobj, activeDbObjs) {
|
BOOST_FOREACH(const DbObject::Ptr& dbobj, activeDbObjs) {
|
||||||
if (dbobj->GetObject() == NULL) {
|
if (dbobj->GetObject() == NULL) {
|
||||||
Log(LogNotice, "IdoMysqlConnection")
|
Log(LogNotice, "IdoMysqlConnection")
|
||||||
|
@ -750,6 +752,9 @@ bool IdoMysqlConnection::FieldToEscapedString(const String& key, const Value& va
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!IsIDCacheValid())
|
||||||
|
return false;
|
||||||
|
|
||||||
DbReference dbrefcol;
|
DbReference dbrefcol;
|
||||||
|
|
||||||
if (DbValue::IsObjectInsertID(value)) {
|
if (DbValue::IsObjectInsertID(value)) {
|
||||||
|
@ -817,6 +822,9 @@ void IdoMysqlConnection::ExecuteMultipleQueries(const std::vector<DbQuery>& quer
|
||||||
|
|
||||||
bool IdoMysqlConnection::CanExecuteQuery(const DbQuery& query)
|
bool IdoMysqlConnection::CanExecuteQuery(const DbQuery& query)
|
||||||
{
|
{
|
||||||
|
if (query.Object && !IsIDCacheValid())
|
||||||
|
return false;
|
||||||
|
|
||||||
if (query.WhereCriteria) {
|
if (query.WhereCriteria) {
|
||||||
ObjectLock olock(query.WhereCriteria);
|
ObjectLock olock(query.WhereCriteria);
|
||||||
Value value;
|
Value value;
|
||||||
|
@ -877,6 +885,11 @@ void IdoMysqlConnection::InternalExecuteQuery(const DbQuery& query, DbQueryType
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!CanExecuteQuery(query)) {
|
||||||
|
m_QueryQueue.Enqueue(boost::bind(&IdoMysqlConnection::InternalExecuteQuery, this, query, typeOverride), query.Priority);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (GetCategoryFilter() != DbCatEverything && (query.Category & GetCategoryFilter()) == 0)
|
if (GetCategoryFilter() != DbCatEverything && (query.Category & GetCategoryFilter()) == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -371,6 +371,8 @@ void IdoPgsqlConnection::Reconnect(void)
|
||||||
activeDbObjs.push_back(dbobj);
|
activeDbObjs.push_back(dbobj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SetIDCacheValid(true);
|
||||||
|
|
||||||
BOOST_FOREACH(const DbObject::Ptr& dbobj, activeDbObjs) {
|
BOOST_FOREACH(const DbObject::Ptr& dbobj, activeDbObjs) {
|
||||||
if (dbobj->GetObject() == NULL) {
|
if (dbobj->GetObject() == NULL) {
|
||||||
Log(LogNotice, "IdoPgsqlConnection")
|
Log(LogNotice, "IdoPgsqlConnection")
|
||||||
|
@ -607,6 +609,9 @@ bool IdoPgsqlConnection::FieldToEscapedString(const String& key, const Value& va
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!IsIDCacheValid())
|
||||||
|
return false;
|
||||||
|
|
||||||
DbReference dbrefcol;
|
DbReference dbrefcol;
|
||||||
|
|
||||||
if (DbValue::IsObjectInsertID(value)) {
|
if (DbValue::IsObjectInsertID(value)) {
|
||||||
|
@ -674,6 +679,9 @@ void IdoPgsqlConnection::ExecuteMultipleQueries(const std::vector<DbQuery>& quer
|
||||||
|
|
||||||
bool IdoPgsqlConnection::CanExecuteQuery(const DbQuery& query)
|
bool IdoPgsqlConnection::CanExecuteQuery(const DbQuery& query)
|
||||||
{
|
{
|
||||||
|
if (query.Object && !IsIDCacheValid())
|
||||||
|
return false;
|
||||||
|
|
||||||
if (query.WhereCriteria) {
|
if (query.WhereCriteria) {
|
||||||
ObjectLock olock(query.WhereCriteria);
|
ObjectLock olock(query.WhereCriteria);
|
||||||
Value value;
|
Value value;
|
||||||
|
@ -734,6 +742,11 @@ void IdoPgsqlConnection::InternalExecuteQuery(const DbQuery& query, DbQueryType
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!CanExecuteQuery(query)) {
|
||||||
|
m_QueryQueue.Enqueue(boost::bind(&IdoPgsqlConnection::InternalExecuteQuery, this, query, typeOverride), query.Priority);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (GetCategoryFilter() != DbCatEverything && (query.Category & GetCategoryFilter()) == 0)
|
if (GetCategoryFilter() != DbCatEverything && (query.Category & GetCategoryFilter()) == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue