DB IDO: Add failover_timeout attribute

refs #6827
This commit is contained in:
Michael Friedrich 2014-08-15 17:13:32 +02:00
parent e8a41d86c8
commit 1c98a3a9f7
8 changed files with 28 additions and 3 deletions

View File

@ -275,7 +275,7 @@ void IdoMysqlConnection::Reconnect(void)
Log(LogNotice, "IdoMysqlConnection", "Last update by '" + Log(LogNotice, "IdoMysqlConnection", "Last update by '" +
endpoint_name + "' was " + Convert::ToString(status_update_age) + "s ago."); endpoint_name + "' was " + Convert::ToString(status_update_age) + "s ago.");
if (status_update_age < 60) { if (status_update_age < GetFailoverTimeout()) {
mysql_close(&m_Connection); mysql_close(&m_Connection);
m_Connected = false; m_Connected = false;

View File

@ -271,7 +271,7 @@ void IdoPgsqlConnection::Reconnect(void)
Log(LogNotice, "IdoPgsqlConnection", "Last update by '" + Log(LogNotice, "IdoPgsqlConnection", "Last update by '" +
endpoint_name + "' was " + Convert::ToString(status_update_age) + "s ago."); endpoint_name + "' was " + Convert::ToString(status_update_age) + "s ago.");
if (status_update_age < 60) { if (status_update_age < GetFailoverTimeout()) {
PQfinish(m_Connection); PQfinish(m_Connection);
m_Connection = NULL; m_Connection = NULL;

View File

@ -516,7 +516,8 @@ by running the following query:
(1 Zeile) (1 Zeile)
This is useful when the cluster connection between endpoints breaks, and prevents This is useful when the cluster connection between endpoints breaks, and prevents
data duplication in split-brain-scenarios. data duplication in split-brain-scenarios. The failover timeout can be set for the
`failover_timeout` attribute, but not lower than 60 seconds.
### <a id="cluster-scenarios"></a> Cluster Scenarios ### <a id="cluster-scenarios"></a> Cluster Scenarios

View File

@ -1273,6 +1273,7 @@ Attributes:
instance\_name |**Optional.** Unique identifier for the local Icinga 2 instance. Defaults to "default". instance\_name |**Optional.** Unique identifier for the local Icinga 2 instance. Defaults to "default".
instance\_description|**Optional.** Description for the Icinga 2 instance. instance\_description|**Optional.** Description for the Icinga 2 instance.
enable_ha |**Optional.** Enable the high availability functionality. Only valid in a [cluster setup](#high-availability-db-ido). Defaults to "true". enable_ha |**Optional.** Enable the high availability functionality. Only valid in a [cluster setup](#high-availability-db-ido). Defaults to "true".
failover_timeout | **Optional.** Set the failover timeout in a [HA cluster](#high-availability-db-ido). Must not be lower than 60s". Defaults to "60s".
cleanup |**Optional.** Dictionary with items for historical table cleanup. cleanup |**Optional.** Dictionary with items for historical table cleanup.
categories |**Optional.** The types of information that should be written to the database. categories |**Optional.** The types of information that should be written to the database.
@ -1361,6 +1362,7 @@ Attributes:
instance\_name |**Optional.** Unique identifier for the local Icinga 2 instance. Defaults to "default". instance\_name |**Optional.** Unique identifier for the local Icinga 2 instance. Defaults to "default".
instance\_description|**Optional.** Description for the Icinga 2 instance. instance\_description|**Optional.** Description for the Icinga 2 instance.
enable_ha |**Optional.** Enable the high availability functionality. Only valid in a [cluster setup](#high-availability-db-ido). Defaults to "true". enable_ha |**Optional.** Enable the high availability functionality. Only valid in a [cluster setup](#high-availability-db-ido). Defaults to "true".
failover_timeout | **Optional.** Set the failover timeout in a [HA cluster](#high-availability-db-ido). Must not be lower than 60s". Defaults to "60s".
cleanup |**Optional.** Dictionary with items for historical table cleanup. cleanup |**Optional.** Dictionary with items for historical table cleanup.
categories |**Optional.** The types of information that should be written to the database. categories |**Optional.** The types of information that should be written to the database.

View File

@ -18,6 +18,8 @@
******************************************************************************/ ******************************************************************************/
%type DbConnection { %type DbConnection {
%validator "ValidateFailoverTimeout"
%attribute %string "table_prefix", %attribute %string "table_prefix",
%attribute %dictionary "cleanup" { %attribute %dictionary "cleanup" {
@ -41,4 +43,6 @@
%attribute %number "categories", %attribute %number "categories",
%attribute %number "enable_ha", %attribute %number "enable_ha",
%attribute %number "failover_timeout",
} }

View File

@ -22,17 +22,20 @@
#include "icinga/icingaapplication.hpp" #include "icinga/icingaapplication.hpp"
#include "icinga/host.hpp" #include "icinga/host.hpp"
#include "icinga/service.hpp" #include "icinga/service.hpp"
#include "config/configcompilercontext.hpp"
#include "base/dynamictype.hpp" #include "base/dynamictype.hpp"
#include "base/convert.hpp" #include "base/convert.hpp"
#include "base/objectlock.hpp" #include "base/objectlock.hpp"
#include "base/utility.hpp" #include "base/utility.hpp"
#include "base/initialize.hpp" #include "base/initialize.hpp"
#include "base/logger_fwd.hpp" #include "base/logger_fwd.hpp"
#include "base/scriptfunction.hpp"
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
using namespace icinga; using namespace icinga;
REGISTER_TYPE(DbConnection); REGISTER_TYPE(DbConnection);
REGISTER_SCRIPTFUNCTION(ValidateFailoverTimeout, &DbConnection::ValidateFailoverTimeout);
Timer::Ptr DbConnection::m_ProgramStatusTimer; Timer::Ptr DbConnection::m_ProgramStatusTimer;
@ -410,3 +413,12 @@ void DbConnection::PrepareDatabase(void)
FillIDCache(type); FillIDCache(type);
} }
} }
void DbConnection::ValidateFailoverTimeout(const String& location, const Dictionary::Ptr& attrs)
{
Value failover_timeout = attrs->Get("failover_timeout");
if (failover_timeout < 60) {
ConfigCompilerContext::GetInstance()->AddMessage(true, "Validation failed for " +
location + ": Failover timeout minimum is 60s.");
}
}

View File

@ -63,6 +63,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;
static void ValidateFailoverTimeout(const String& location, const Dictionary::Ptr& attrs);
protected: protected:
virtual void OnConfigLoaded(void); virtual void OnConfigLoaded(void);
virtual void Start(void); virtual void Start(void);

View File

@ -25,6 +25,10 @@ abstract class DbConnection : DynamicObject
[config] bool enable_ha { [config] bool enable_ha {
default {{{ return true; }}} default {{{ return true; }}}
}; };
[config] double failover_timeout {
default {{{ return 60; }}}
};
}; };
} }