diff --git a/HISTORY b/HISTORY
index a38f21eb..567e3257 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1,6 +1,8 @@
5.3.0 2021-??-??
repmgrd: prefix all shared library functions with "repmgr_" to
minimize the risk of clashes with other shared libraries (Ian)
+ repmgrd: at startup, if node record is marked as "inactive", attempt
+ to set it to "active" (Ian)
5.2.2. 2021-??-??
standby clone: set "slot_name" in node record if required (Ian)
diff --git a/configdata.c b/configdata.c
index 46439922..d40d158a 100644
--- a/configdata.c
+++ b/configdata.c
@@ -581,6 +581,16 @@ struct ConfigFileSetting config_file_settings[] =
{ .strmaxlen = sizeof(config_file_options.repmgrd_pid_file) },
{ .postprocess_func = &repmgr_canonicalize_path }
},
+ /* repmgrd_exit_on_inactive_node */
+ {
+ "repmgrd_exit_on_inactive_node",
+ CONFIG_BOOL,
+ { .boolptr = &config_file_options.repmgrd_exit_on_inactive_node},
+ { .booldefault = DEFAULT_REPMGRD_EXIT_ON_INACTIVE_NODE },
+ {},
+ {},
+ {}
+ },
/* standby_disconnect_on_failover */
{
"standby_disconnect_on_failover",
diff --git a/configfile.h b/configfile.h
index 3cdb2939..3bcb9f51 100644
--- a/configfile.h
+++ b/configfile.h
@@ -206,6 +206,7 @@ typedef struct
int primary_notification_timeout;
int repmgrd_standby_startup_timeout;
char repmgrd_pid_file[MAXPGPATH];
+ bool repmgrd_exit_on_inactive_node;
bool standby_disconnect_on_failover;
int sibling_nodes_disconnect_timeout;
ConnectionCheckType connection_check_type;
diff --git a/doc/appendix-release-notes.xml b/doc/appendix-release-notes.xml
index 58228060..c5adb7fd 100644
--- a/doc/appendix-release-notes.xml
+++ b/doc/appendix-release-notes.xml
@@ -26,6 +26,23 @@
This release provides support for PostgreSQL 14,
to be released later in 2021.
+
+ Improvements
+
+
+
+
+ &repmgrd;: at startup, if node record is marked as "inactive", attempt
+ to set it to "active".
+
+
+ This behaviour can be overridden by setting the configuration parameter
+ repmgrd_exit_on_inactive_node to true.
+
+
+
+
+ Bug fixes
diff --git a/doc/repmgrd-configuration.xml b/doc/repmgrd-configuration.xml
index f4ebd785..31a4eea8 100644
--- a/doc/repmgrd-configuration.xml
+++ b/doc/repmgrd-configuration.xml
@@ -485,6 +485,32 @@
+
+
+
+
+
+ repmgrd_exit_on_inactive_node
+
+
+ This parameter is available in &repmgr; 5.3 and later.
+
+
+ If a node was marked as inactive but is running, and this option is set to
+ true, &repmgrd; will abort on startup.
+
+
+ By default, is set
+ to false, in which case &repmgrd; will set the
+ node record to active on startup.
+
+
+ Setting this parameter to true causes &repmgrd;
+ to behave in the same way it did in &repmgr; 5.2 and earlier.
+
+
+
+
diff --git a/repmgr.conf.sample b/repmgr.conf.sample
index 0f06de0c..4ce39571 100644
--- a/repmgr.conf.sample
+++ b/repmgr.conf.sample
@@ -337,6 +337,7 @@ ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
# "--no-pid-file" will force PID file creation to be skipped.
# Note: there is normally no need to set this, particularly if
# repmgr was installed from packages.
+#repmgrd_exit_on_inactive_node=false # If "true", and the node record is marked as "inactive", abort repmgrd startup
#standby_disconnect_on_failover=false # If "true", in a failover situation wait for all standbys to
# disconnect their WAL receivers before electing a new primary
# (PostgreSQL 9.5 and later only; repmgr user must be a superuser for this)
diff --git a/repmgr.h b/repmgr.h
index d59ef124..d9d231cc 100644
--- a/repmgr.h
+++ b/repmgr.h
@@ -135,6 +135,7 @@
#define DEFAULT_ASYNC_QUERY_TIMEOUT 60 /* seconds */
#define DEFAULT_PRIMARY_NOTIFICATION_TIMEOUT 60 /* seconds */
#define DEFAULT_REPMGRD_STANDBY_STARTUP_TIMEOUT -1 /*seconds */
+#define DEFAULT_REPMGRD_EXIT_ON_INACTIVE_NODE false,
#define DEFAULT_STANDBY_DISCONNECT_ON_FAILOVER false
#define DEFAULT_SIBLING_NODES_DISCONNECT_TIMEOUT 30 /* seconds */
#define DEFAULT_CONNECTION_CHECK_TYPE CHECK_PING
diff --git a/repmgrd-physical.c b/repmgrd-physical.c
index 5c1d3e03..ddf0f0fe 100644
--- a/repmgrd-physical.c
+++ b/repmgrd-physical.c
@@ -169,7 +169,7 @@ handle_sigint_physical(SIGNAL_ARGS)
/* perform some sanity checks on the node's configuration */
void
-do_physical_node_check(void)
+do_physical_node_check(PGconn *conn)
{
/*
* Check if node record is active - if not, and `failover=automatic`, the
@@ -186,8 +186,37 @@ do_physical_node_check(void)
{
char *hint = "Check that \"repmgr (primary|standby) register\" was executed for this node";
+ /*
+ * Attempt to set node record active (unless explicitly configured not to)
+ */
+ if (config_file_options.repmgrd_exit_on_inactive_node == false)
+ {
+ PGconn *primary_conn = get_primary_connection_quiet(conn, NULL, NULL);
+ bool success = true;
+
+ if (PQstatus(primary_conn) != CONNECTION_OK)
+ {
+ success = false;
+ }
+ else
+ {
+ log_notice(_("setting node record for node \"%s\" (ID: %i) to \"active\""),
+ local_node_info.node_name,
+ local_node_info.node_id);
+ success = update_node_record_set_active(primary_conn, local_node_info.node_id, true);
+ PQfinish(primary_conn);
+ }
+
+ if (success == true)
+ {
+ local_node_info.active = true;
+ return;
+ }
+ }
+
switch (config_file_options.failover)
{
+
/* "failover" is an enum, all values should be covered here */
case FAILOVER_AUTOMATIC:
diff --git a/repmgrd-physical.h b/repmgrd-physical.h
index 114303f0..c02e11cf 100644
--- a/repmgrd-physical.h
+++ b/repmgrd-physical.h
@@ -19,7 +19,7 @@
#ifndef _REPMGRD_PHYSICAL_H_
#define _REPMGRD_PHYSICAL_H_
-void do_physical_node_check(void);
+void do_physical_node_check(PGconn *conn);
void monitor_streaming_primary(void);
void monitor_streaming_standby(void);
diff --git a/repmgrd.c b/repmgrd.c
index 9d291133..94be8d6a 100644
--- a/repmgrd.c
+++ b/repmgrd.c
@@ -512,7 +512,7 @@ main(int argc, char **argv)
log_debug("node id is %i, upstream node id is %i",
local_node_info.node_id,
local_node_info.upstream_node_id);
- do_physical_node_check();
+ do_physical_node_check(local_conn);
}
if (daemonize == true)