From 1c98a3a9f7ecbedeb6682648da06a12d8ee2e0a7 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 15 Aug 2014 17:13:32 +0200 Subject: [PATCH] DB IDO: Add failover_timeout attribute refs #6827 --- components/db_ido_mysql/idomysqlconnection.cpp | 2 +- components/db_ido_pgsql/idopgsqlconnection.cpp | 2 +- doc/4-monitoring-remote-systems.md | 3 ++- doc/6-configuring-icinga-2.md | 2 ++ lib/db_ido/db_ido-type.conf | 4 ++++ lib/db_ido/dbconnection.cpp | 12 ++++++++++++ lib/db_ido/dbconnection.hpp | 2 ++ lib/db_ido/dbconnection.ti | 4 ++++ 8 files changed, 28 insertions(+), 3 deletions(-) diff --git a/components/db_ido_mysql/idomysqlconnection.cpp b/components/db_ido_mysql/idomysqlconnection.cpp index a7097ad11..fb6d61fa6 100644 --- a/components/db_ido_mysql/idomysqlconnection.cpp +++ b/components/db_ido_mysql/idomysqlconnection.cpp @@ -275,7 +275,7 @@ void IdoMysqlConnection::Reconnect(void) Log(LogNotice, "IdoMysqlConnection", "Last update by '" + endpoint_name + "' was " + Convert::ToString(status_update_age) + "s ago."); - if (status_update_age < 60) { + if (status_update_age < GetFailoverTimeout()) { mysql_close(&m_Connection); m_Connected = false; diff --git a/components/db_ido_pgsql/idopgsqlconnection.cpp b/components/db_ido_pgsql/idopgsqlconnection.cpp index a83785037..9fe413dfb 100644 --- a/components/db_ido_pgsql/idopgsqlconnection.cpp +++ b/components/db_ido_pgsql/idopgsqlconnection.cpp @@ -271,7 +271,7 @@ void IdoPgsqlConnection::Reconnect(void) Log(LogNotice, "IdoPgsqlConnection", "Last update by '" + endpoint_name + "' was " + Convert::ToString(status_update_age) + "s ago."); - if (status_update_age < 60) { + if (status_update_age < GetFailoverTimeout()) { PQfinish(m_Connection); m_Connection = NULL; diff --git a/doc/4-monitoring-remote-systems.md b/doc/4-monitoring-remote-systems.md index 8a082842d..e95bd1c0f 100644 --- a/doc/4-monitoring-remote-systems.md +++ b/doc/4-monitoring-remote-systems.md @@ -516,7 +516,8 @@ by running the following query: (1 Zeile) 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. ### Cluster Scenarios diff --git a/doc/6-configuring-icinga-2.md b/doc/6-configuring-icinga-2.md index 20399795b..97f18a40c 100644 --- a/doc/6-configuring-icinga-2.md +++ b/doc/6-configuring-icinga-2.md @@ -1273,6 +1273,7 @@ Attributes: instance\_name |**Optional.** Unique identifier for the local Icinga 2 instance. Defaults to "default". 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". + 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. 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\_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". + 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. categories |**Optional.** The types of information that should be written to the database. diff --git a/lib/db_ido/db_ido-type.conf b/lib/db_ido/db_ido-type.conf index 780e52c69..b9e6847f1 100644 --- a/lib/db_ido/db_ido-type.conf +++ b/lib/db_ido/db_ido-type.conf @@ -18,6 +18,8 @@ ******************************************************************************/ %type DbConnection { + %validator "ValidateFailoverTimeout" + %attribute %string "table_prefix", %attribute %dictionary "cleanup" { @@ -41,4 +43,6 @@ %attribute %number "categories", %attribute %number "enable_ha", + + %attribute %number "failover_timeout", } diff --git a/lib/db_ido/dbconnection.cpp b/lib/db_ido/dbconnection.cpp index 47a59f1b7..4c641ab80 100644 --- a/lib/db_ido/dbconnection.cpp +++ b/lib/db_ido/dbconnection.cpp @@ -22,17 +22,20 @@ #include "icinga/icingaapplication.hpp" #include "icinga/host.hpp" #include "icinga/service.hpp" +#include "config/configcompilercontext.hpp" #include "base/dynamictype.hpp" #include "base/convert.hpp" #include "base/objectlock.hpp" #include "base/utility.hpp" #include "base/initialize.hpp" #include "base/logger_fwd.hpp" +#include "base/scriptfunction.hpp" #include using namespace icinga; REGISTER_TYPE(DbConnection); +REGISTER_SCRIPTFUNCTION(ValidateFailoverTimeout, &DbConnection::ValidateFailoverTimeout); Timer::Ptr DbConnection::m_ProgramStatusTimer; @@ -410,3 +413,12 @@ void DbConnection::PrepareDatabase(void) 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."); + } +} diff --git a/lib/db_ido/dbconnection.hpp b/lib/db_ido/dbconnection.hpp index b71f920e3..e800bfdcb 100644 --- a/lib/db_ido/dbconnection.hpp +++ b/lib/db_ido/dbconnection.hpp @@ -63,6 +63,8 @@ public: void SetStatusUpdate(const DbObject::Ptr& dbobj, bool hasupdate); bool GetStatusUpdate(const DbObject::Ptr& dbobj) const; + static void ValidateFailoverTimeout(const String& location, const Dictionary::Ptr& attrs); + protected: virtual void OnConfigLoaded(void); virtual void Start(void); diff --git a/lib/db_ido/dbconnection.ti b/lib/db_ido/dbconnection.ti index da9f0c327..33a1c6821 100644 --- a/lib/db_ido/dbconnection.ti +++ b/lib/db_ido/dbconnection.ti @@ -25,6 +25,10 @@ abstract class DbConnection : DynamicObject [config] bool enable_ha { default {{{ return true; }}} }; + + [config] double failover_timeout { + default {{{ return 60; }}} + }; }; }