Compare commits

..

4 Commits

Author SHA1 Message Date
Martín Marqués
c9c380a022 Provide fix for failing pg_rewind with non-superuser
Issue #829 was opened indicating, with a reproducible, that repmgr
was not able to run `node rejoin` with minimal privileged user. The
main obstacle is that pg_rewind is not able to execute the rewind
operation if the user has REPLICATION privileges, but the user
repmgr uses requires REPLICATION. This is a typical catch22.

The solution provided here adds a --superuser, similar to what
other commands have, to `node rejoin`

AI-assisted development notes:

    The approach was designed and directed by Martín Marqués, who
    also reviewed and refined the output. Code was written by Claude
    (AI), with some additions from Martín in the documentation.

Fixes #829

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Martín Marqués <martin.marques@enterprisedb.com>
2026-03-28 17:01:48 +01:00
Arthur Nascimento
e696e28f43 install-requirements.xml: fix compatibility matrix
The same document states that "repmgr 5.5.0 is compatible with all
supported PostgreSQL versions from 13.x", so 12 shouldn't be listed in
the matrix.

Moreover, 14 is missing in 5.5 and 5.4.1, which looks like an accidental
omission that might have happened when support for 15 was added on a
version that only advertized 13 up to that point. 14 should have been
added along with 15 then.
2025-04-17 11:27:45 -04:00
Ian Barwick
8a3cdcd1b9 doc: update README
Update contributors list to reflect current status.
2025-01-21 10:47:05 +09:00
Mario Gonzalez
682bd7306d Update product matrix and copyright date
References: https://github.com/EnterpriseDB/repmgr/issues/879
2025-01-15 15:42:38 -03:00
7 changed files with 78 additions and 6 deletions

View File

@@ -68,7 +68,6 @@ news are always welcome.
Thanks from the repmgr core team. Thanks from the repmgr core team.
* Ian Barwick
* Israel Barth * Israel Barth
* Mario González * Mario González
* Martín Marqués * Martín Marqués
@@ -76,6 +75,7 @@ Thanks from the repmgr core team.
Past contributors: Past contributors:
* Ian Barwick
* Jaime Casanova * Jaime Casanova
* Abhijit Menon-Sen * Abhijit Menon-Sen
* Simon Riggs * Simon Riggs

View File

@@ -192,6 +192,9 @@
<listitem> <listitem>
<simpara><link linkend="repmgr-node-service">repmgr node service</link> (to execute <command>CHECKPOINT</command> via the <option>--checkpoint</option>; note this is also called by <link linkend="repmgr-standby-switchover">repmgr standby switchover</link>)</simpara> <simpara><link linkend="repmgr-node-service">repmgr node service</link> (to execute <command>CHECKPOINT</command> via the <option>--checkpoint</option>; note this is also called by <link linkend="repmgr-standby-switchover">repmgr standby switchover</link>)</simpara>
</listitem> </listitem>
<listitem>
<simpara><link linkend="repmgr-node-rejoin">repmgr node rejoin</link> (to execute <command>repmgr node rejoin --force-rewind</command>)</simpara>
</listitem>
</itemizedlist> </itemizedlist>
</para> </para>
</sect3> </sect3>

View File

@@ -125,7 +125,7 @@
<link linkend="release-5.5.0">&repmgrversion;</link> (&releasedate;) <link linkend="release-5.5.0">&repmgrversion;</link> (&releasedate;)
</entry> </entry>
<entry> <entry>
12, 13, 15, 16, 17 13, 14, 15, 16, 17
</entry> </entry>
<entry> <entry>
&nbsp; &nbsp;
@@ -143,7 +143,7 @@
<link linkend="release-5.4.1">5.4.1</link> (2023-04-04) <link linkend="release-5.4.1">5.4.1</link> (2023-04-04)
</entry> </entry>
<entry> <entry>
10, 11, 12, 13, 15 10, 11, 12, 13, 14, 15
</entry> </entry>
<entry> <entry>
&nbsp; &nbsp;

View File

@@ -113,6 +113,29 @@
</varlistentry> </varlistentry>
<varlistentry>
<term><option>-S/--superuser</option></term>
<listitem>
<para>
Specify a superuser to be used by <application>pg_rewind</application>
for its source server connection.
</para>
<para>
<application>pg_rewind</application> requires a normal (non-replication)
connection with <literal>pg_read_server_files</literal> privilege or
superuser rights. If the &repmgr; user has the <literal>REPLICATION</literal>
attribute but lacks these privileges, use this option to specify
a suitably privileged user for the <application>pg_rewind</application>
connection. The superuser's password should be configured in
<filename>.pgpass</filename>.
</para>
<para>
This option is only effective in combination with
<option>--force-rewind</option>.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><option>-W/--no-wait</option></term> <term><option>-W/--no-wait</option></term>
<listitem> <listitem>
@@ -281,6 +304,23 @@
a &quot;magic bullet&quot; which can resolve all problematic replication situations. a &quot;magic bullet&quot; which can resolve all problematic replication situations.
</para> </para>
<note>
<para>
<command>pg_rewind</command> requires a normal (non-replication) connection to
the source server. The user for this connection must have superuser rights or
the <literal>pg_read_server_files</literal> role.
</para>
<para>
If the &repmgr; user has the <literal>REPLICATION</literal> attribute but does
not have the privileges required by <command>pg_rewind</command>, use the
<option>-S/--superuser</option> option to specify a suitably privileged user
for the <command>pg_rewind</command> source connection. For example:
<programlisting>
repmgr node rejoin -f /etc/repmgr.conf -d 'host=node3 dbname=repmgr user=repmgr' \
--force-rewind -S postgres</programlisting>
</para>
</note>
<para> <para>
A typical use-case for <command>pg_rewind</command> is when a scenario like the following A typical use-case for <command>pg_rewind</command> is when a scenario like the following
is encountered: is encountered:

View File

@@ -2838,9 +2838,29 @@ do_node_rejoin(void)
appendShellString(&command, appendShellString(&command,
config_file_options.data_directory); config_file_options.data_directory);
appendPQExpBuffer(&command, if (runtime_options.superuser[0] != '\0')
" --source-server='%s'", {
primary_node_record.conninfo); 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) 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" \ printf(_(" --config-archive-dir directory to temporarily store retained configuration files\n" \
" (default: /tmp)\n")); " (default: /tmp)\n"));
printf(_(" -W, --no-wait don't wait for the node to rejoin cluster\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(""); puts("");
printf(_("NODE SERVICE\n")); printf(_("NODE SERVICE\n"));

View File

@@ -5359,6 +5359,13 @@ do_standby_switchover(void)
} }
appendPQExpBufferChar(&node_rejoin_options, ' '); 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); key_value_list_free(&remote_config_files);

View File

@@ -1761,6 +1761,7 @@ check_cli_parameters(const int action)
case STANDBY_SWITCHOVER: case STANDBY_SWITCHOVER:
case NODE_CHECK: case NODE_CHECK:
case NODE_SERVICE: case NODE_SERVICE:
case NODE_REJOIN:
break; break;
default: default:
item_list_append_format(&cli_warnings, item_list_append_format(&cli_warnings,