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; }}}
+ };
};
}