mirror of
https://github.com/Icinga/icinga2.git
synced 2025-05-30 19:30:19 +02:00
parent
94fde1a6b2
commit
a4d37132bf
@ -52,12 +52,23 @@ The `cluster` check command does not support any vars.
|
|||||||
|
|
||||||
Check command for the built-in `cluster-zone` check.
|
Check command for the built-in `cluster-zone` check.
|
||||||
|
|
||||||
Cluster Attributes:
|
Custom Attributes:
|
||||||
|
|
||||||
Name | Description
|
Name | Description
|
||||||
-------------|---------------
|
-------------|---------------
|
||||||
cluster_zone | **Optional.** The zone name. Defaults to "$host.name$".
|
cluster_zone | **Optional.** The zone name. Defaults to "$host.name$".
|
||||||
|
|
||||||
|
### <a id="itl-icinga-ido"></a> ido
|
||||||
|
|
||||||
|
Check command for the built-in `ido` check.
|
||||||
|
|
||||||
|
Custom Attributes:
|
||||||
|
|
||||||
|
Name | Description
|
||||||
|
-------------|---------------
|
||||||
|
ido_type | **Required.** The type of the IDO connection object. Can be either "IdoMysqlConnection" or "IdoPgsqlConnection".
|
||||||
|
ido_name | **Required.** The name of the IDO connection object.
|
||||||
|
|
||||||
# <a id="plugin-check-commands"></a> Plugin Check Commands
|
# <a id="plugin-check-commands"></a> Plugin Check Commands
|
||||||
|
|
||||||
The Plugin Check Commands provides example configuration for plugin check commands
|
The Plugin Check Commands provides example configuration for plugin check commands
|
||||||
|
@ -18,13 +18,15 @@
|
|||||||
mkclass_target(dbconnection.ti dbconnection.thpp)
|
mkclass_target(dbconnection.ti dbconnection.thpp)
|
||||||
|
|
||||||
mkembedconfig_target(db_ido-type.conf db_ido-type.cpp)
|
mkembedconfig_target(db_ido-type.conf db_ido-type.cpp)
|
||||||
|
mkembedconfig_target(db_ido-check.conf db_ido-check.cpp)
|
||||||
|
|
||||||
set(db_ido_SOURCES
|
set(db_ido_SOURCES
|
||||||
commanddbobject.cpp dbconnection.cpp dbconnection.thpp dbconnection.thpp
|
commanddbobject.cpp dbconnection.cpp dbconnection.thpp dbconnection.thpp
|
||||||
db_ido-type.cpp dbevents.cpp dbobject.cpp dbquery.cpp dbreference.cpp dbtype.cpp
|
db_ido-type.cpp db_ido-check.cpp dbevents.cpp dbobject.cpp dbquery.cpp
|
||||||
dbvalue.cpp endpointdbobject.cpp hostdbobject.cpp hostgroupdbobject.cpp
|
dbreference.cpp dbtype.cpp dbvalue.cpp endpointdbobject.cpp hostdbobject.cpp
|
||||||
servicedbobject.cpp servicegroupdbobject.cpp timeperioddbobject.cpp
|
hostgroupdbobject.cpp idochecktask.cpp servicedbobject.cpp
|
||||||
userdbobject.cpp usergroupdbobject.cpp
|
servicegroupdbobject.cpp timeperioddbobject.cpp userdbobject.cpp
|
||||||
|
usergroupdbobject.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
if(ICINGA2_UNITY_BUILD)
|
if(ICINGA2_UNITY_BUILD)
|
||||||
|
26
lib/db_ido/db_ido-check.conf
Normal file
26
lib/db_ido/db_ido-check.conf
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Icinga 2 *
|
||||||
|
* Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org) *
|
||||||
|
* *
|
||||||
|
* This program is free software; you can redistribute it and/or *
|
||||||
|
* modify it under the terms of the GNU General Public License *
|
||||||
|
* as published by the Free Software Foundation; either version 2 *
|
||||||
|
* of the License, or (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with this program; if not, write to the Free Software Foundation *
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
template CheckCommand "ido-check-command" {
|
||||||
|
execute = IdoCheck
|
||||||
|
}
|
||||||
|
|
||||||
|
object CheckCommand "ido" {
|
||||||
|
import "ido-check-command"
|
||||||
|
}
|
@ -39,6 +39,10 @@ REGISTER_SCRIPTFUNCTION(ValidateFailoverTimeout, &DbConnection::ValidateFailover
|
|||||||
Timer::Ptr DbConnection::m_ProgramStatusTimer;
|
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)
|
||||||
|
: m_QueryStats(15 * 60)
|
||||||
|
{ }
|
||||||
|
|
||||||
void DbConnection::OnConfigLoaded(void)
|
void DbConnection::OnConfigLoaded(void)
|
||||||
{
|
{
|
||||||
DynamicObject::OnConfigLoaded();
|
DynamicObject::OnConfigLoaded();
|
||||||
@ -443,3 +447,17 @@ void DbConnection::ValidateFailoverTimeout(const String& location, const DbConne
|
|||||||
location + ": Failover timeout minimum is 60s.", object->GetDebugInfo()));
|
location + ": Failover timeout minimum is 60s.", object->GetDebugInfo()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DbConnection::IncreaseQueryCount(void)
|
||||||
|
{
|
||||||
|
double now = Utility::GetTime();
|
||||||
|
|
||||||
|
boost::mutex::scoped_lock lock(m_StatsMutex);
|
||||||
|
m_QueryStats.InsertValue(now, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DbConnection::GetQueryCount(RingBuffer::SizeType span) const
|
||||||
|
{
|
||||||
|
boost::mutex::scoped_lock lock(m_StatsMutex);
|
||||||
|
return m_QueryStats.GetValues(span);
|
||||||
|
}
|
||||||
|
@ -25,7 +25,9 @@
|
|||||||
#include "db_ido/dbobject.hpp"
|
#include "db_ido/dbobject.hpp"
|
||||||
#include "db_ido/dbquery.hpp"
|
#include "db_ido/dbquery.hpp"
|
||||||
#include "base/timer.hpp"
|
#include "base/timer.hpp"
|
||||||
|
#include "base/ringbuffer.hpp"
|
||||||
#include <boost/thread/once.hpp>
|
#include <boost/thread/once.hpp>
|
||||||
|
#include <boost/thread/mutex.hpp>
|
||||||
|
|
||||||
#define IDO_CURRENT_SCHEMA_VERSION "1.13.0"
|
#define IDO_CURRENT_SCHEMA_VERSION "1.13.0"
|
||||||
#define IDO_COMPAT_SCHEMA_VERSION "1.12.0"
|
#define IDO_COMPAT_SCHEMA_VERSION "1.12.0"
|
||||||
@ -43,6 +45,8 @@ class I2_DB_IDO_API DbConnection : public ObjectImpl<DbConnection>
|
|||||||
public:
|
public:
|
||||||
DECLARE_OBJECT(DbConnection);
|
DECLARE_OBJECT(DbConnection);
|
||||||
|
|
||||||
|
DbConnection(void);
|
||||||
|
|
||||||
static void InitializeDbTimer(void);
|
static void InitializeDbTimer(void);
|
||||||
|
|
||||||
void SetObjectID(const DbObject::Ptr& dbobj, const DbReference& dbref);
|
void SetObjectID(const DbObject::Ptr& dbobj, const DbReference& dbref);
|
||||||
@ -67,6 +71,8 @@ public:
|
|||||||
void SetStatusUpdate(const DbObject::Ptr& dbobj, bool hasupdate);
|
void SetStatusUpdate(const DbObject::Ptr& dbobj, bool hasupdate);
|
||||||
bool GetStatusUpdate(const DbObject::Ptr& dbobj) const;
|
bool GetStatusUpdate(const DbObject::Ptr& dbobj) const;
|
||||||
|
|
||||||
|
int GetQueryCount(RingBuffer::SizeType span) const;
|
||||||
|
|
||||||
static void ValidateFailoverTimeout(const String& location, const DbConnection::Ptr& object);
|
static void ValidateFailoverTimeout(const String& location, const DbConnection::Ptr& object);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -87,6 +93,8 @@ protected:
|
|||||||
|
|
||||||
void PrepareDatabase(void);
|
void PrepareDatabase(void);
|
||||||
|
|
||||||
|
void IncreaseQueryCount(void);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
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;
|
||||||
@ -105,6 +113,9 @@ private:
|
|||||||
|
|
||||||
static void InsertRuntimeVariable(const String& key, const Value& value);
|
static void InsertRuntimeVariable(const String& key, const Value& value);
|
||||||
static void ProgramStatusHandler(void);
|
static void ProgramStatusHandler(void);
|
||||||
|
|
||||||
|
mutable boost::mutex m_StatsMutex;
|
||||||
|
RingBuffer m_QueryStats;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct database_error : virtual std::exception, virtual boost::exception { };
|
struct database_error : virtual std::exception, virtual boost::exception { };
|
||||||
|
@ -48,6 +48,12 @@ abstract class DbConnection : DynamicObject
|
|||||||
[config] double failover_timeout {
|
[config] double failover_timeout {
|
||||||
default {{{ return 60; }}}
|
default {{{ return 60; }}}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
String schema_version;
|
||||||
|
bool connected;
|
||||||
|
bool should_connect {
|
||||||
|
default {{{ return true; }}}
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
115
lib/db_ido/idochecktask.cpp
Normal file
115
lib/db_ido/idochecktask.cpp
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Icinga 2 *
|
||||||
|
* Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org) *
|
||||||
|
* *
|
||||||
|
* This program is free software; you can redistribute it and/or *
|
||||||
|
* modify it under the terms of the GNU General Public License *
|
||||||
|
* as published by the Free Software Foundation; either version 2 *
|
||||||
|
* of the License, or (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with this program; if not, write to the Free Software Foundation *
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#include "db_ido/idochecktask.hpp"
|
||||||
|
#include "icinga/host.hpp"
|
||||||
|
#include "icinga/checkcommand.hpp"
|
||||||
|
#include "icinga/macroprocessor.hpp"
|
||||||
|
#include "icinga/perfdatavalue.hpp"
|
||||||
|
#include "remote/apilistener.hpp"
|
||||||
|
#include "remote/endpoint.hpp"
|
||||||
|
#include "remote/zone.hpp"
|
||||||
|
#include "base/function.hpp"
|
||||||
|
#include "base/utility.hpp"
|
||||||
|
#include "base/dynamictype.hpp"
|
||||||
|
#include "base/convert.hpp"
|
||||||
|
#include <boost/foreach.hpp>
|
||||||
|
|
||||||
|
using namespace icinga;
|
||||||
|
|
||||||
|
REGISTER_SCRIPTFUNCTION(IdoCheck, &IdoCheckTask::ScriptFunc);
|
||||||
|
|
||||||
|
void IdoCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr,
|
||||||
|
const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros)
|
||||||
|
{
|
||||||
|
CheckCommand::Ptr commandObj = checkable->GetCheckCommand();
|
||||||
|
Value raw_command = commandObj->GetCommandLine();
|
||||||
|
|
||||||
|
Host::Ptr host;
|
||||||
|
Service::Ptr service;
|
||||||
|
tie(host, service) = GetHostService(checkable);
|
||||||
|
|
||||||
|
MacroProcessor::ResolverList resolvers;
|
||||||
|
if (service)
|
||||||
|
resolvers.push_back(std::make_pair("service", service));
|
||||||
|
resolvers.push_back(std::make_pair("host", host));
|
||||||
|
resolvers.push_back(std::make_pair("command", commandObj));
|
||||||
|
resolvers.push_back(std::make_pair("icinga", IcingaApplication::GetInstance()));
|
||||||
|
|
||||||
|
String idoType = MacroProcessor::ResolveMacros("$ido_type$", resolvers, checkable->GetLastCheckResult(),
|
||||||
|
NULL, MacroProcessor::EscapeCallback(), resolvedMacros, useResolvedMacros);
|
||||||
|
|
||||||
|
if (resolvedMacros && !useResolvedMacros)
|
||||||
|
return;
|
||||||
|
|
||||||
|
String idoName = MacroProcessor::ResolveMacros("$ido_name$", resolvers, checkable->GetLastCheckResult(),
|
||||||
|
NULL, MacroProcessor::EscapeCallback(), resolvedMacros, useResolvedMacros);
|
||||||
|
|
||||||
|
if (resolvedMacros && !useResolvedMacros)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (idoName.IsEmpty()) {
|
||||||
|
cr->SetOutput("Macro 'ido_name' must be set.");
|
||||||
|
cr->SetState(ServiceUnknown);
|
||||||
|
checkable->ProcessCheckResult(cr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Type::Ptr type = Type::GetByName(idoType);
|
||||||
|
|
||||||
|
if (!type || !Type::GetByName("DbConnection")->IsAssignableFrom(type)) {
|
||||||
|
cr->SetOutput("IDO type '" + idoType + "' is invalid.");
|
||||||
|
cr->SetState(ServiceUnknown);
|
||||||
|
checkable->ProcessCheckResult(cr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DynamicType::Ptr dtype = DynamicType::GetByName(idoType);
|
||||||
|
VERIFY(dtype);
|
||||||
|
|
||||||
|
DbConnection::Ptr conn = static_pointer_cast<DbConnection>(dtype->GetObject(idoName));
|
||||||
|
|
||||||
|
double qps = conn->GetQueryCount(60) / 60.0;
|
||||||
|
|
||||||
|
if (!conn->GetConnected() && conn->GetShouldConnect()) {
|
||||||
|
cr->SetOutput("Could not connect to the database server.");
|
||||||
|
cr->SetState(ServiceCritical);
|
||||||
|
} else {
|
||||||
|
String schema_version = conn->GetSchemaVersion();
|
||||||
|
|
||||||
|
if (Utility::CompareVersion(IDO_CURRENT_SCHEMA_VERSION, schema_version) < 0) {
|
||||||
|
cr->SetOutput("Outdated schema version: " + schema_version + "; Latest version: " IDO_CURRENT_SCHEMA_VERSION);
|
||||||
|
cr->SetState(ServiceWarning);
|
||||||
|
} else {
|
||||||
|
std::ostringstream msgbuf;
|
||||||
|
msgbuf << "Connected to the database server; queries per second: " << std::fixed << std::setprecision(3) << qps;
|
||||||
|
cr->SetOutput(msgbuf.str());
|
||||||
|
cr->SetState(ServiceOK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Array::Ptr perfdata = new Array();
|
||||||
|
perfdata->Add(new PerfdataValue("queries", qps));
|
||||||
|
perfdata->Add(new PerfdataValue("queries_1min", conn->GetQueryCount(60)));
|
||||||
|
perfdata->Add(new PerfdataValue("queries_5mins", conn->GetQueryCount(5 * 60)));
|
||||||
|
perfdata->Add(new PerfdataValue("queries_15mins", conn->GetQueryCount(15 * 60)));
|
||||||
|
cr->SetPerformanceData(perfdata);
|
||||||
|
|
||||||
|
checkable->ProcessCheckResult(cr);
|
||||||
|
}
|
46
lib/db_ido/idochecktask.hpp
Normal file
46
lib/db_ido/idochecktask.hpp
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Icinga 2 *
|
||||||
|
* Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org) *
|
||||||
|
* *
|
||||||
|
* This program is free software; you can redistribute it and/or *
|
||||||
|
* modify it under the terms of the GNU General Public License *
|
||||||
|
* as published by the Free Software Foundation; either version 2 *
|
||||||
|
* of the License, or (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with this program; if not, write to the Free Software Foundation *
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef IDOCHECKTASK_H
|
||||||
|
#define IDOCHECKTASK_H
|
||||||
|
|
||||||
|
#include "db_ido/dbconnection.hpp"
|
||||||
|
#include "icinga/checkable.hpp"
|
||||||
|
|
||||||
|
namespace icinga
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IDO check type.
|
||||||
|
*
|
||||||
|
* @ingroup db_ido
|
||||||
|
*/
|
||||||
|
class IdoCheckTask
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void ScriptFunc(const Checkable::Ptr& service, const CheckResult::Ptr& cr,
|
||||||
|
const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros);
|
||||||
|
|
||||||
|
private:
|
||||||
|
IdoCheckTask(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* IDOCHECKTASK_H */
|
@ -38,7 +38,7 @@ REGISTER_TYPE(IdoMysqlConnection);
|
|||||||
REGISTER_STATSFUNCTION(IdoMysqlConnectionStats, &IdoMysqlConnection::StatsFunc);
|
REGISTER_STATSFUNCTION(IdoMysqlConnectionStats, &IdoMysqlConnection::StatsFunc);
|
||||||
|
|
||||||
IdoMysqlConnection::IdoMysqlConnection(void)
|
IdoMysqlConnection::IdoMysqlConnection(void)
|
||||||
: m_QueryQueue(500000), m_Connected(false)
|
: m_QueryQueue(500000)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
void IdoMysqlConnection::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata)
|
void IdoMysqlConnection::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata)
|
||||||
@ -49,7 +49,7 @@ void IdoMysqlConnection::StatsFunc(const Dictionary::Ptr& status, const Array::P
|
|||||||
size_t items = idomysqlconnection->m_QueryQueue.GetLength();
|
size_t items = idomysqlconnection->m_QueryQueue.GetLength();
|
||||||
|
|
||||||
Dictionary::Ptr stats = new Dictionary();
|
Dictionary::Ptr stats = new Dictionary();
|
||||||
stats->Set("version", IDO_CURRENT_SCHEMA_VERSION);
|
stats->Set("version", idomysqlconnection->GetSchemaVersion());
|
||||||
stats->Set("instance_name", idomysqlconnection->GetInstanceName());
|
stats->Set("instance_name", idomysqlconnection->GetInstanceName());
|
||||||
stats->Set("query_queue_items", items);
|
stats->Set("query_queue_items", items);
|
||||||
|
|
||||||
@ -65,7 +65,7 @@ void IdoMysqlConnection::Resume(void)
|
|||||||
{
|
{
|
||||||
DbConnection::Resume();
|
DbConnection::Resume();
|
||||||
|
|
||||||
m_Connected = false;
|
SetConnected(false);
|
||||||
|
|
||||||
m_QueryQueue.SetExceptionCallback(boost::bind(&IdoMysqlConnection::ExceptionHandler, this, _1));
|
m_QueryQueue.SetExceptionCallback(boost::bind(&IdoMysqlConnection::ExceptionHandler, this, _1));
|
||||||
|
|
||||||
@ -102,10 +102,10 @@ void IdoMysqlConnection::ExceptionHandler(boost::exception_ptr exp)
|
|||||||
|
|
||||||
boost::mutex::scoped_lock lock(m_ConnectionMutex);
|
boost::mutex::scoped_lock lock(m_ConnectionMutex);
|
||||||
|
|
||||||
if (m_Connected) {
|
if (GetConnected()) {
|
||||||
mysql_close(&m_Connection);
|
mysql_close(&m_Connection);
|
||||||
|
|
||||||
m_Connected = false;
|
SetConnected(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,13 +120,13 @@ void IdoMysqlConnection::Disconnect(void)
|
|||||||
|
|
||||||
boost::mutex::scoped_lock lock(m_ConnectionMutex);
|
boost::mutex::scoped_lock lock(m_ConnectionMutex);
|
||||||
|
|
||||||
if (!m_Connected)
|
if (!GetConnected())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Query("COMMIT");
|
Query("COMMIT");
|
||||||
mysql_close(&m_Connection);
|
mysql_close(&m_Connection);
|
||||||
|
|
||||||
m_Connected = false;
|
SetConnected(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IdoMysqlConnection::TxTimerHandler(void)
|
void IdoMysqlConnection::TxTimerHandler(void)
|
||||||
@ -143,7 +143,7 @@ void IdoMysqlConnection::InternalNewTransaction(void)
|
|||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(m_ConnectionMutex);
|
boost::mutex::scoped_lock lock(m_ConnectionMutex);
|
||||||
|
|
||||||
if (!m_Connected)
|
if (!GetConnected())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Query("COMMIT");
|
Query("COMMIT");
|
||||||
@ -161,6 +161,8 @@ void IdoMysqlConnection::Reconnect(void)
|
|||||||
|
|
||||||
CONTEXT("Reconnecting to MySQL IDO database '" + GetName() + "'");
|
CONTEXT("Reconnecting to MySQL IDO database '" + GetName() + "'");
|
||||||
|
|
||||||
|
SetShouldConnect(true);
|
||||||
|
|
||||||
std::vector<DbObject::Ptr> active_dbobjs;
|
std::vector<DbObject::Ptr> active_dbobjs;
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -168,13 +170,13 @@ void IdoMysqlConnection::Reconnect(void)
|
|||||||
|
|
||||||
bool reconnect = false;
|
bool reconnect = false;
|
||||||
|
|
||||||
if (m_Connected) {
|
if (GetConnected()) {
|
||||||
/* Check if we're really still connected */
|
/* Check if we're really still connected */
|
||||||
if (mysql_ping(&m_Connection) == 0)
|
if (mysql_ping(&m_Connection) == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mysql_close(&m_Connection);
|
mysql_close(&m_Connection);
|
||||||
m_Connected = false;
|
SetConnected(false);
|
||||||
reconnect = true;
|
reconnect = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,7 +215,7 @@ void IdoMysqlConnection::Reconnect(void)
|
|||||||
BOOST_THROW_EXCEPTION(std::runtime_error(mysql_error(&m_Connection)));
|
BOOST_THROW_EXCEPTION(std::runtime_error(mysql_error(&m_Connection)));
|
||||||
}
|
}
|
||||||
|
|
||||||
m_Connected = true;
|
SetConnected(true);
|
||||||
|
|
||||||
String dbVersionName = "idoutils";
|
String dbVersionName = "idoutils";
|
||||||
IdoMysqlResult result = Query("SELECT version FROM " + GetTablePrefix() + "dbversion WHERE name='" + Escape(dbVersionName) + "'");
|
IdoMysqlResult result = Query("SELECT version FROM " + GetTablePrefix() + "dbversion WHERE name='" + Escape(dbVersionName) + "'");
|
||||||
@ -222,7 +224,7 @@ void IdoMysqlConnection::Reconnect(void)
|
|||||||
|
|
||||||
if (!row) {
|
if (!row) {
|
||||||
mysql_close(&m_Connection);
|
mysql_close(&m_Connection);
|
||||||
m_Connected = false;
|
SetConnected(false);
|
||||||
|
|
||||||
Log(LogCritical, "IdoMysqlConnection", "Schema does not provide any valid version! Verify your schema installation.");
|
Log(LogCritical, "IdoMysqlConnection", "Schema does not provide any valid version! Verify your schema installation.");
|
||||||
|
|
||||||
@ -234,9 +236,11 @@ void IdoMysqlConnection::Reconnect(void)
|
|||||||
|
|
||||||
String version = row->Get("version");
|
String version = row->Get("version");
|
||||||
|
|
||||||
|
SetSchemaVersion(version);
|
||||||
|
|
||||||
if (Utility::CompareVersion(IDO_COMPAT_SCHEMA_VERSION, version) < 0) {
|
if (Utility::CompareVersion(IDO_COMPAT_SCHEMA_VERSION, version) < 0) {
|
||||||
mysql_close(&m_Connection);
|
mysql_close(&m_Connection);
|
||||||
m_Connected = false;
|
SetConnected(false);
|
||||||
|
|
||||||
Log(LogCritical, "IdoMysqlConnection")
|
Log(LogCritical, "IdoMysqlConnection")
|
||||||
<< "Schema version '" << version << "' does not match the required version '"
|
<< "Schema version '" << version << "' does not match the required version '"
|
||||||
@ -293,7 +297,8 @@ void IdoMysqlConnection::Reconnect(void)
|
|||||||
|
|
||||||
if (status_update_age < GetFailoverTimeout()) {
|
if (status_update_age < GetFailoverTimeout()) {
|
||||||
mysql_close(&m_Connection);
|
mysql_close(&m_Connection);
|
||||||
m_Connected = false;
|
SetConnected(false);
|
||||||
|
SetShouldConnect(false);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -304,7 +309,7 @@ void IdoMysqlConnection::Reconnect(void)
|
|||||||
<< "Local endpoint '" << my_endpoint->GetName() << "' is not authoritative, bailing out.";
|
<< "Local endpoint '" << my_endpoint->GetName() << "' is not authoritative, bailing out.";
|
||||||
|
|
||||||
mysql_close(&m_Connection);
|
mysql_close(&m_Connection);
|
||||||
m_Connected = false;
|
SetConnected(false);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -374,6 +379,8 @@ IdoMysqlResult IdoMysqlConnection::Query(const String& query)
|
|||||||
Log(LogDebug, "IdoMysqlConnection")
|
Log(LogDebug, "IdoMysqlConnection")
|
||||||
<< "Query: " << query;
|
<< "Query: " << query;
|
||||||
|
|
||||||
|
IncreaseQueryCount();
|
||||||
|
|
||||||
if (mysql_query(&m_Connection, query.CStr()) != 0) {
|
if (mysql_query(&m_Connection, query.CStr()) != 0) {
|
||||||
std::ostringstream msgbuf;
|
std::ostringstream msgbuf;
|
||||||
String message = mysql_error(&m_Connection);
|
String message = mysql_error(&m_Connection);
|
||||||
@ -484,7 +491,7 @@ void IdoMysqlConnection::ActivateObject(const DbObject::Ptr& dbobj)
|
|||||||
|
|
||||||
void IdoMysqlConnection::InternalActivateObject(const DbObject::Ptr& dbobj)
|
void IdoMysqlConnection::InternalActivateObject(const DbObject::Ptr& dbobj)
|
||||||
{
|
{
|
||||||
if (!m_Connected)
|
if (!GetConnected())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DbReference dbref = GetObjectID(dbobj);
|
DbReference dbref = GetObjectID(dbobj);
|
||||||
@ -513,7 +520,7 @@ void IdoMysqlConnection::DeactivateObject(const DbObject::Ptr& dbobj)
|
|||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(m_ConnectionMutex);
|
boost::mutex::scoped_lock lock(m_ConnectionMutex);
|
||||||
|
|
||||||
if (!m_Connected)
|
if (!GetConnected())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DbReference dbref = GetObjectID(dbobj);
|
DbReference dbref = GetObjectID(dbobj);
|
||||||
@ -606,7 +613,7 @@ void IdoMysqlConnection::InternalExecuteQuery(const DbQuery& query, DbQueryType
|
|||||||
if ((query.Category & GetCategories()) == 0)
|
if ((query.Category & GetCategories()) == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!m_Connected)
|
if (!GetConnected())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (query.Object && query.Object->GetObject()->GetExtension("agent_check").ToBool())
|
if (query.Object && query.Object->GetObject()->GetExtension("agent_check").ToBool())
|
||||||
@ -746,7 +753,7 @@ void IdoMysqlConnection::InternalCleanUpExecuteQuery(const String& table, const
|
|||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(m_ConnectionMutex);
|
boost::mutex::scoped_lock lock(m_ConnectionMutex);
|
||||||
|
|
||||||
if (!m_Connected)
|
if (!GetConnected())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Query("DELETE FROM " + GetTablePrefix() + table + " WHERE instance_id = " +
|
Query("DELETE FROM " + GetTablePrefix() + table + " WHERE instance_id = " +
|
||||||
|
@ -63,7 +63,6 @@ private:
|
|||||||
WorkQueue m_QueryQueue;
|
WorkQueue m_QueryQueue;
|
||||||
|
|
||||||
boost::mutex m_ConnectionMutex;
|
boost::mutex m_ConnectionMutex;
|
||||||
bool m_Connected;
|
|
||||||
MYSQL m_Connection;
|
MYSQL m_Connection;
|
||||||
int m_AffectedRows;
|
int m_AffectedRows;
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ void IdoPgsqlConnection::StatsFunc(const Dictionary::Ptr& status, const Array::P
|
|||||||
size_t items = idopgsqlconnection->m_QueryQueue.GetLength();
|
size_t items = idopgsqlconnection->m_QueryQueue.GetLength();
|
||||||
|
|
||||||
Dictionary::Ptr stats = new Dictionary();
|
Dictionary::Ptr stats = new Dictionary();
|
||||||
stats->Set("version", IDO_CURRENT_SCHEMA_VERSION);
|
stats->Set("version", idopgsqlconnection->GetSchemaVersion());
|
||||||
stats->Set("instance_name", idopgsqlconnection->GetInstanceName());
|
stats->Set("instance_name", idopgsqlconnection->GetInstanceName());
|
||||||
stats->Set("query_queue_items", items);
|
stats->Set("query_queue_items", items);
|
||||||
|
|
||||||
@ -67,6 +67,7 @@ void IdoPgsqlConnection::Resume(void)
|
|||||||
{
|
{
|
||||||
DbConnection::Resume();
|
DbConnection::Resume();
|
||||||
|
|
||||||
|
SetConnected(false);
|
||||||
m_Connection = NULL;
|
m_Connection = NULL;
|
||||||
|
|
||||||
m_QueryQueue.SetExceptionCallback(boost::bind(&IdoPgsqlConnection::ExceptionHandler, this, _1));
|
m_QueryQueue.SetExceptionCallback(boost::bind(&IdoPgsqlConnection::ExceptionHandler, this, _1));
|
||||||
@ -106,6 +107,7 @@ void IdoPgsqlConnection::ExceptionHandler(boost::exception_ptr exp)
|
|||||||
|
|
||||||
if (m_Connection) {
|
if (m_Connection) {
|
||||||
PQfinish(m_Connection);
|
PQfinish(m_Connection);
|
||||||
|
SetConnected(false);
|
||||||
m_Connection = NULL;
|
m_Connection = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -127,6 +129,7 @@ void IdoPgsqlConnection::Disconnect(void)
|
|||||||
Query("COMMIT");
|
Query("COMMIT");
|
||||||
PQfinish(m_Connection);
|
PQfinish(m_Connection);
|
||||||
|
|
||||||
|
SetConnected(false);
|
||||||
m_Connection = NULL;
|
m_Connection = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,6 +178,7 @@ void IdoPgsqlConnection::Reconnect(void)
|
|||||||
Query("SELECT 1");
|
Query("SELECT 1");
|
||||||
return;
|
return;
|
||||||
} catch (const std::exception&) {
|
} catch (const std::exception&) {
|
||||||
|
SetConnected(false);
|
||||||
PQfinish(m_Connection);
|
PQfinish(m_Connection);
|
||||||
m_Connection = NULL;
|
m_Connection = NULL;
|
||||||
reconnect = true;
|
reconnect = true;
|
||||||
@ -203,9 +207,12 @@ void IdoPgsqlConnection::Reconnect(void)
|
|||||||
if (!m_Connection)
|
if (!m_Connection)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
SetConnected(true);
|
||||||
|
|
||||||
if (PQstatus(m_Connection) != CONNECTION_OK) {
|
if (PQstatus(m_Connection) != CONNECTION_OK) {
|
||||||
String message = PQerrorMessage(m_Connection);
|
String message = PQerrorMessage(m_Connection);
|
||||||
PQfinish(m_Connection);
|
PQfinish(m_Connection);
|
||||||
|
SetConnected(false);
|
||||||
m_Connection = NULL;
|
m_Connection = NULL;
|
||||||
|
|
||||||
Log(LogCritical, "IdoPgsqlConnection")
|
Log(LogCritical, "IdoPgsqlConnection")
|
||||||
@ -222,18 +229,21 @@ void IdoPgsqlConnection::Reconnect(void)
|
|||||||
|
|
||||||
if (!row) {
|
if (!row) {
|
||||||
PQfinish(m_Connection);
|
PQfinish(m_Connection);
|
||||||
|
SetConnected(false);
|
||||||
m_Connection = NULL;
|
m_Connection = NULL;
|
||||||
|
|
||||||
Log(LogCritical, "IdoPgsqlConnection", "Schema does not provide any valid version! Verify your schema installation.");
|
Log(LogCritical, "IdoPgsqlConnection", "Schema does not provide any valid version! Verify your schema installation.");
|
||||||
|
|
||||||
Application::RequestShutdown(EXIT_FAILURE);
|
BOOST_THROW_EXCEPTION(std::runtime_error("Schema does not provide any valid version! Verify your schema installation."));
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String version = row->Get("version");
|
String version = row->Get("version");
|
||||||
|
|
||||||
|
SetSchemaVersion(version);
|
||||||
|
|
||||||
if (Utility::CompareVersion(IDO_COMPAT_SCHEMA_VERSION, version) < 0) {
|
if (Utility::CompareVersion(IDO_COMPAT_SCHEMA_VERSION, version) < 0) {
|
||||||
PQfinish(m_Connection);
|
PQfinish(m_Connection);
|
||||||
|
SetConnected(false);
|
||||||
m_Connection = NULL;
|
m_Connection = NULL;
|
||||||
|
|
||||||
Log(LogCritical, "IdoPgsqlConnection")
|
Log(LogCritical, "IdoPgsqlConnection")
|
||||||
@ -288,6 +298,7 @@ void IdoPgsqlConnection::Reconnect(void)
|
|||||||
|
|
||||||
if (status_update_age < GetFailoverTimeout()) {
|
if (status_update_age < GetFailoverTimeout()) {
|
||||||
PQfinish(m_Connection);
|
PQfinish(m_Connection);
|
||||||
|
SetConnected(false);
|
||||||
m_Connection = NULL;
|
m_Connection = NULL;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -299,6 +310,7 @@ void IdoPgsqlConnection::Reconnect(void)
|
|||||||
<< "Local endpoint '" << my_endpoint->GetName() << "' is not authoritative, bailing out.";
|
<< "Local endpoint '" << my_endpoint->GetName() << "' is not authoritative, bailing out.";
|
||||||
|
|
||||||
PQfinish(m_Connection);
|
PQfinish(m_Connection);
|
||||||
|
SetConnected(false);
|
||||||
m_Connection = NULL;
|
m_Connection = NULL;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -369,6 +381,8 @@ IdoPgsqlResult IdoPgsqlConnection::Query(const String& query)
|
|||||||
Log(LogDebug, "IdoPgsqlConnection")
|
Log(LogDebug, "IdoPgsqlConnection")
|
||||||
<< "Query: " << query;
|
<< "Query: " << query;
|
||||||
|
|
||||||
|
IncreaseQueryCount();
|
||||||
|
|
||||||
PGresult *result = PQexec(m_Connection, query.CStr());
|
PGresult *result = PQexec(m_Connection, query.CStr());
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
|
@ -30,5 +30,6 @@ macro(MKEMBEDCONFIG_TARGET EmbedInput EmbedOutput)
|
|||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
DEPENDS mkembedconfig ${EmbedInput}
|
DEPENDS mkembedconfig ${EmbedInput}
|
||||||
)
|
)
|
||||||
|
set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${EmbedOutput} PROPERTY EXCLUDE_UNITY_BUILD TRUE)
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user