diff --git a/doc/configuration-permissions.xml b/doc/configuration-permissions.xml
index f27d1807..6237e41b 100644
--- a/doc/configuration-permissions.xml
+++ b/doc/configuration-permissions.xml
@@ -192,6 +192,9 @@
repmgr node service (to execute CHECKPOINT via the ; note this is also called by repmgr standby switchover)
+
+ repmgr node rejoin (to execute repmgr node rejoin --force-rewind)
+
diff --git a/doc/repmgr-node-rejoin.xml b/doc/repmgr-node-rejoin.xml
index bae78f4c..590b6915 100644
--- a/doc/repmgr-node-rejoin.xml
+++ b/doc/repmgr-node-rejoin.xml
@@ -113,6 +113,29 @@
+
+
+
+
+ Specify a superuser to be used by pg_rewind
+ for its source server connection.
+
+
+ pg_rewind requires a normal (non-replication)
+ connection with pg_read_server_files privilege or
+ superuser rights. If the &repmgr; user has the REPLICATION
+ attribute but lacks these privileges, use this option to specify
+ a suitably privileged user for the pg_rewind
+ connection. The superuser's password should be configured in
+ .pgpass.
+
+
+ This option is only effective in combination with
+ .
+
+
+
+
@@ -281,6 +304,23 @@
a "magic bullet" which can resolve all problematic replication situations.
+
+
+ pg_rewind requires a normal (non-replication) connection to
+ the source server. The user for this connection must have superuser rights or
+ the pg_read_server_files role.
+
+
+ If the &repmgr; user has the REPLICATION attribute but does
+ not have the privileges required by pg_rewind, use the
+ option to specify a suitably privileged user
+ for the pg_rewind source connection. For example:
+
+ repmgr node rejoin -f /etc/repmgr.conf -d 'host=node3 dbname=repmgr user=repmgr' \
+ --force-rewind -S postgres
+
+
+
A typical use-case for pg_rewind is when a scenario like the following
is encountered:
diff --git a/repmgr-action-node.c b/repmgr-action-node.c
index 32e5ab14..b2d4bea3 100644
--- a/repmgr-action-node.c
+++ b/repmgr-action-node.c
@@ -2838,9 +2838,29 @@ do_node_rejoin(void)
appendShellString(&command,
config_file_options.data_directory);
- appendPQExpBuffer(&command,
- " --source-server='%s'",
- primary_node_record.conninfo);
+ if (runtime_options.superuser[0] != '\0')
+ {
+ t_conninfo_param_list rewind_conninfo = T_CONNINFO_PARAM_LIST_INITIALIZER;
+ char *rewind_conninfo_str = NULL;
+
+ initialize_conninfo_params(&rewind_conninfo, false);
+ parse_conninfo_string(primary_node_record.conninfo, &rewind_conninfo, NULL, false);
+ param_set(&rewind_conninfo, "user", runtime_options.superuser);
+ rewind_conninfo_str = param_list_to_string(&rewind_conninfo);
+
+ appendPQExpBuffer(&command,
+ " --source-server='%s'",
+ rewind_conninfo_str);
+
+ pfree(rewind_conninfo_str);
+ free_conninfo_params(&rewind_conninfo);
+ }
+ else
+ {
+ appendPQExpBuffer(&command,
+ " --source-server='%s'",
+ primary_node_record.conninfo);
+ }
if (runtime_options.dry_run == true)
{
@@ -3698,6 +3718,7 @@ do_node_help(void)
printf(_(" --config-archive-dir directory to temporarily store retained configuration files\n" \
" (default: /tmp)\n"));
printf(_(" -W, --no-wait don't wait for the node to rejoin cluster\n"));
+ printf(_(" -S, --superuser=USERNAME superuser to use for pg_rewind if repmgr user is not superuser\n"));
puts("");
printf(_("NODE SERVICE\n"));
diff --git a/repmgr-action-standby.c b/repmgr-action-standby.c
index a55462b0..249c6e59 100644
--- a/repmgr-action-standby.c
+++ b/repmgr-action-standby.c
@@ -5359,6 +5359,13 @@ do_standby_switchover(void)
}
appendPQExpBufferChar(&node_rejoin_options, ' ');
+
+ if (runtime_options.superuser[0] != '\0')
+ {
+ appendPQExpBuffer(&node_rejoin_options,
+ "--superuser=%s ",
+ runtime_options.superuser);
+ }
}
key_value_list_free(&remote_config_files);
diff --git a/repmgr-client.c b/repmgr-client.c
index 022ccec9..af319b8f 100644
--- a/repmgr-client.c
+++ b/repmgr-client.c
@@ -1761,6 +1761,7 @@ check_cli_parameters(const int action)
case STANDBY_SWITCHOVER:
case NODE_CHECK:
case NODE_SERVICE:
+ case NODE_REJOIN:
break;
default:
item_list_append_format(&cli_warnings,