diff --git a/HISTORY b/HISTORY
index 9cc1ea56..a327f4b2 100644
--- a/HISTORY
+++ b/HISTORY
@@ -24,6 +24,7 @@
repmgr: ensure BDR2-specific functionality cannot be used on
BDR3 and later (Ian)
repmgr: canonicalize the data directory path (Ian)
+ repmgr: note that "standby follow" requires a primary to be available (Ian)
repmgrd: monitor standbys attached to primary (Ian)
repmgrd: add "primary visibility consensus" functionality (Ian)
repmgrd: fix memory leak which occurs while the monitored PostgreSQL
diff --git a/doc/appendix-release-notes.xml b/doc/appendix-release-notes.xml
index cb08a81e..68f7290e 100644
--- a/doc/appendix-release-notes.xml
+++ b/doc/appendix-release-notes.xml
@@ -43,6 +43,14 @@
+
+
+ repmgr standby follow:
+ note that an active, reachable cluster primary is required for this command;
+ and provide a more helpful error message if no reachable primary could be found.
+
+
+
&repmgr;: when executing repmgr standby switchover,
@@ -75,7 +83,6 @@
-
repmgr standby promote:
diff --git a/doc/repmgr-standby-follow.xml b/doc/repmgr-standby-follow.xml
index 6ff8e306..b0f4a6b6 100644
--- a/doc/repmgr-standby-follow.xml
+++ b/doc/repmgr-standby-follow.xml
@@ -20,49 +20,54 @@
("follow target"). Typically this will be the primary, but this
command can also be used to attach the standby to another standby.
+
- This command requires a valid
- repmgr.conf file for the standby, either specified
- explicitly with -f/--config-file or located in a
+ This command requires a valid repmgr.conf file for the standby,
+ either specified explicitly with -f/--config-file or located in a
default location; no additional arguments are required.
-
- By default &repmgr; will attempt to attach the standby to the current primary.
- If is provided, &repmgr; will attempt
- to attach the standby to the specified node, which can be another standby.
-
-
-
- This command will force a restart of the standby server, which must be
- running.
+ The standby node ("follow candidate") must
+ be running. If the new upstream ("follow target") is not the primary,
+ the cluster primary must be running and accessible from the
+ standby node.
-
+
- To re-add an inactive node to the replication cluster, use
- .
+ To re-add an inactive node to the replication cluster, use
+ .
-
+
-
- repmgr standby follow will wait up to
- standby_follow_timeout seconds (default: 30)
- to verify the standby has actually connected to the new upstream node.
-
+
+ By default &repmgr; will attempt to attach the standby to the current primary.
+ If is provided, &repmgr; will attempt
+ to attach the standby to the specified node, which can be another standby.
+
-
-
- If is set for the standby, it
- will not attach to the new upstream node until it has replayed available
- WAL.
-
-
- Conversely, if the standby is attached to an upstream standby
- which has set, the upstream
- standby's replay state may actually be behind that of its new downstream node.
-
-
+
+ This command will force a restart of PostgreSQL on the standby node.
+
+
+
+ repmgr standby follow will wait up to
+ standby_follow_timeout seconds (default: 30)
+ to verify the standby has actually connected to the new upstream node.
+
+
+
+
+ If is set for the standby, it
+ will not attach to the new upstream node until it has replayed available
+ WAL.
+
+
+ Conversely, if the standby is attached to an upstream standby
+ which has set, the upstream
+ standby's replay state may actually be behind that of its new downstream node.
+
+
@@ -124,7 +129,7 @@
Note that when using &repmgrd;,
should always be configured;
- see Automatic failover configuration
+ see Automatic failover configuration
for details.
diff --git a/repmgr-action-standby.c b/repmgr-action-standby.c
index f13f658f..304750c1 100644
--- a/repmgr-action-standby.c
+++ b/repmgr-action-standby.c
@@ -2784,12 +2784,6 @@ do_standby_follow(void)
PQfinish(local_conn);
- if (runtime_options.dry_run == true)
- {
- log_info(_("prerequisites for executing STANDBY FOLLOW are met"));
- exit(SUCCESS);
- }
-
/*
* Here we'll need a connection to the primary, if the upstream is not a primary.
*/
@@ -2802,12 +2796,30 @@ do_standby_follow(void)
primary_conn = get_primary_connection_quiet(follow_target_conn,
&primary_node_id,
NULL);
+
+ /*
+ * If follow target is not primary and no other primary could be found,
+ * abort because we won't be able to update the node record.
+ */
+ if (PQstatus(primary_conn) != CONNECTION_OK)
+ {
+ log_error(_("unable to determine the cluster primary"));
+ log_detail(_("an active primary node is required for \"repmgr standby follow\""));
+ PQfinish(follow_target_conn);
+ exit(ERR_FOLLOW_FAIL);
+ }
}
else
{
primary_conn = follow_target_conn;
}
+ if (runtime_options.dry_run == true)
+ {
+ log_info(_("prerequisites for executing STANDBY FOLLOW are met"));
+ exit(SUCCESS);
+ }
+
initPQExpBuffer(&follow_output);
success = do_standby_follow_internal(