Compare commits

..

18 Commits

Author SHA1 Message Date
Martín Marqués
bd60929910 Replace 9.4 with 10, as that's the minimal version we support now with 5.4.1
Signed-off-by: Martín Marqués <martin.marques@enterprisedb.com>
2023-11-16 11:09:25 +00:00
Martín Marqués
82ff0d6873 Adding Postgres version 16 support in 5.4.1
We've done extensive testing of the current version of repmgr against the
new version 16 of Postgres. The tests have passed which gives us the
green light to add the version as supported in repmgr 5.4.1.

The commit only addresses documentation amendments

Signed-off-by: Martín Marqués <martin.marques@enterprisedb.com>
2023-11-16 10:23:15 +00:00
Martín Marqués
26f9cb3f95 Merge pull request #817 from EnterpriseDB/generate-5.4.1-release
Generate 5.4.1 release
2023-07-04 10:25:29 -03:00
Sidorov Pavel
890cbd9fca Update README.md
upd upper version according to https://repmgr.org
2023-07-04 14:56:54 +02:00
Mario Gonzalez
440ba5fbb4 configure.in: bumping to 5.4.1 release.
This release contains all changes related to the new pg-backupapi mode
along with the related documentation. In the previous release, we didn't
include any documentation at all, just the required C code.
2023-07-04 14:56:52 +02:00
Martín Marqués
20f39e2fbe Add release notes for repmgr release 5.4.0
This release added support for pg-backup-api. Here we add the
release notes which expose the new feature.

Signed-off-by: Martín Marqués <martin.marques@enterprisedb.com>
2023-07-04 14:55:32 +02:00
Martín Marqués
afdeb5d7b2 Various improvements and fixes to the pg-backup-api restore section on the docs
I added a paragraph at the beginning of the section on where to look for
instructions on how to install the pg-backup-api rest API.

Fixed typos and some gramatical changes. Also reworded the first paragraph
(which is now the second one).

Signed-off-by: Martín Marqués <martin.marques@enterprisedb.com>
2023-07-04 14:52:15 +02:00
Martín Marqués
7d45ab04b3 New sect1 block has to be inside the sect1. The closing tag has to go at the end.
Signed-off-by: Martín Marqués <martin.marques@enterprisedb.com>
2023-07-04 14:52:05 +02:00
Mario Gonzalez
7af74c4fda Adding new mode to clone standbys.
repmgr v5.4.0 supports this new mode called `pg_backupapi` which is
enabled by defining `pg_backupapi_host` in repmgr.conf.
2023-07-04 14:48:24 +02:00
Martín Marqués
1010aeb3dd Merge pull request #816 from EnterpriseDB/dev/fix-documentation-typos
Fix documentation typos
2023-07-04 09:11:44 -03:00
Martín Marqués
c58c95c9f1 Typo in the documentation
Signed-off-by: Martín Marqués <martin.marques@enterprisedb.com>
2023-07-04 14:08:53 +02:00
Dee Dee Rothery
3887637f1e Update configuration-file-optional-settings.xml 2023-07-04 14:08:44 +02:00
Israel Barth Rubio
7a84e34630 Bump version number
5.4.1

Signed-off-by: Israel Barth Rubio <israel.barth@enterprisedb.com>
2023-07-04 08:41:22 -03:00
Ian Barwick
9ab4acea78 repmgrd: ensure witness node metadata is updated
If the primary changed while the witness repmgrd was not running,
ensure the witness's upstream node ID is updated when the witness
repmgrd is restarted.
2023-06-08 16:39:52 +09:00
Martín Marqués
ef962436f7 Add release notes for repmgr release 5.4.0
This release added support for pg-backup-api. Here we add the
release notes which expose the new feature.

Signed-off-by: Martín Marqués <martin.marques@enterprisedb.com>
2023-03-24 18:34:53 +00:00
Martín Marqués
9a68206b4a Various improvements and fixes to the pg-backup-api restore section on the docs
I added a paragraph at the beginning of the section on where to look for
instructions on how to install the pg-backup-api rest API.

Fixed typos and some gramatical changes. Also reworded the first paragraph
(which is now the second one).

Signed-off-by: Martín Marqués <martin.marques@enterprisedb.com>
2023-03-24 18:25:27 +00:00
Martín Marqués
31af938354 New sect2 block has to be inside the sect1. The closing tag has to go at the end.
Signed-off-by: Martín Marqués <martin.marques@enterprisedb.com>
2023-03-24 18:25:12 +00:00
Mario Gonzalez
061025b62f Adding new mode to clone standbys.
repmgr v5.4.0 supports this new mode called `pg_backupapi` which is
enabled by defining `pg_backupapi_host` in repmgr.conf.
2023-03-24 18:24:56 +00:00
25 changed files with 110 additions and 502 deletions

7
.github/CODEOWNERS vendored
View File

@@ -1,7 +0,0 @@
# Each line is a file pattern followed by one or more owners.
# These owners will be the default owners for everything in
# the repo. Unless a later match takes precedence,
# @global-owner1 and @global-owner2 will be requested for
# review when someone opens a pull request.
* @EnterpriseDB/repmgr-dev

View File

@@ -1,8 +1,3 @@
5.5.0 2024-11-20
Support for PostgreSQL 17 added
Fix warnings detected by the -Wshadow=compatible-local
added in PostgreSQL 16
5.4.1 2023-07-04 5.4.1 2023-07-04
repmgrd: ensure witness node metadata is updated (Ian) repmgrd: ensure witness node metadata is updated (Ian)

View File

@@ -32,9 +32,7 @@ DATA = \
repmgr--5.2--5.3.sql \ repmgr--5.2--5.3.sql \
repmgr--5.3.sql \ repmgr--5.3.sql \
repmgr--5.3--5.4.sql \ repmgr--5.3--5.4.sql \
repmgr--5.4.sql \ repmgr--5.4.sql
repmgr--5.4--5.5.sql \
repmgr--5.5.sql
REGRESS = repmgr_extension REGRESS = repmgr_extension

View File

@@ -7,9 +7,8 @@ replication capabilities with utilities to set up standby servers, monitor
replication, and perform administrative tasks such as failover or switchover replication, and perform administrative tasks such as failover or switchover
operations. operations.
The most recent `repmgr` version (5.5.x) supports all PostgreSQL versions from The most recent `repmgr` version (5.3.2) supports all PostgreSQL versions from
13 to 17. Despite it could be used with some older ones, some features might not 9.5 to 15. PostgreSQL 9.4 is also supported, with some restrictions.
be available, however, it's strongly recommended to use the latest version.
`repmgr` is distributed under the GNU GPL 3 and maintained by EnterpriseDB. `repmgr` is distributed under the GNU GPL 3 and maintained by EnterpriseDB.
@@ -57,6 +56,8 @@ There is a mailing list/forum to discuss contributions or issues:
* https://groups.google.com/group/repmgr * https://groups.google.com/group/repmgr
The IRC channel #repmgr is registered with freenode.
Please report bugs and other issues to: Please report bugs and other issues to:
* https://github.com/EnterpriseDB/repmgr * https://github.com/EnterpriseDB/repmgr
@@ -68,14 +69,6 @@ news are always welcome.
Thanks from the repmgr core team. Thanks from the repmgr core team.
* Ian Barwick
* Israel Barth
* Mario González
* Martín Marqués
* Gianni Ciolli
Past contributors:
* Jaime Casanova * Jaime Casanova
* Abhijit Menon-Sen * Abhijit Menon-Sen
* Simon Riggs * Simon Riggs

View File

@@ -1,8 +1,8 @@
AC_INIT([repmgr], [5.5.0], [repmgr@googlegroups.com], [repmgr], [https://repmgr.org/]) AC_INIT([repmgr],[5.4.1],[repmgr@googlegroups.com],[repmgr],[https://www.repmgr.org/])
AC_COPYRIGHT([Copyright (c) 2010-2024, EnterpriseDB Corporation]) AC_COPYRIGHT([Copyright (c) 2010-2021, EnterpriseDB Corporation])
AC_CONFIG_HEADER(config.h) AC_CONFIG_HEADERS([config.h])
AC_ARG_VAR([PG_CONFIG], [Location to find pg_config for target PostgreSQL (default PATH)]) AC_ARG_VAR([PG_CONFIG], [Location to find pg_config for target PostgreSQL (default PATH)])

106
dbutils.c
View File

@@ -1624,7 +1624,7 @@ get_ready_archive_files(PGconn *conn, const char *data_directory)
while ((arcdir_ent = readdir(arcdir)) != NULL) while ((arcdir_ent = readdir(arcdir)) != NULL)
{ {
struct stat local_statbuf; struct stat statbuf;
char file_path[MAXPGPATH + sizeof(arcdir_ent->d_name)]; char file_path[MAXPGPATH + sizeof(arcdir_ent->d_name)];
int basenamelen = 0; int basenamelen = 0;
@@ -1634,7 +1634,7 @@ get_ready_archive_files(PGconn *conn, const char *data_directory)
arcdir_ent->d_name); arcdir_ent->d_name);
/* skip non-files */ /* skip non-files */
if (stat(file_path, &local_statbuf) == 0 && !S_ISREG(local_statbuf.st_mode)) if (stat(file_path, &statbuf) == 0 && !S_ISREG(statbuf.st_mode))
{ {
continue; continue;
} }
@@ -1852,51 +1852,6 @@ get_wal_receiver_pid(PGconn *conn)
/* =============================== */ /* =============================== */
/*
* Determine if the user associated with the current connection can execute CHECKPOINT command.
* User must be a supersuer or a member of the pg_checkpoint default role (available from PostgreSQL 15).
*/
bool
can_execute_checkpoint(PGconn *conn)
{
PQExpBufferData query;
PGresult *res;
bool has_pg_checkpoint_role = false;
/* superusers can do anything, no role check needed */
if (is_superuser_connection(conn, NULL) == true)
return true;
/* pg_checkpoint available from PostgreSQL 15 */
if (PQserverVersion(conn) < 150000)
return false;
initPQExpBuffer(&query);
appendPQExpBufferStr(&query,
" SELECT pg_catalog.pg_has_role('pg_checkpoint','USAGE') ");
res = PQexec(conn, query.data);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
log_db_error(conn, query.data,
_("can_execute_checkpoint(): unable to query user roles"));
}
else
{
has_pg_checkpoint_role = atobool(PQgetvalue(res, 0, 0));
}
termPQExpBuffer(&query);
PQclear(res);
return has_pg_checkpoint_role;
}
/*
* Determine if the user associated with the current connection
* has sufficient permissions to use pg_promote function
*/
bool bool
can_execute_pg_promote(PGconn *conn) can_execute_pg_promote(PGconn *conn)
{ {
@@ -1958,47 +1913,15 @@ can_disable_walsender(PGconn *conn)
if (is_superuser_connection(conn, NULL) == true) if (is_superuser_connection(conn, NULL) == true)
return true; return true;
PQExpBufferData query; /*
PGresult *res; * As of PostgreSQL 14, it is not possible for a non-superuser
bool has_alter_system_priv = false; * to execute ALTER SYSTEM, so further checks are superfluous.
* This will need modifying for PostgreSQL 15.
*/
log_warning(_("\"standby_disconnect_on_failover\" specified, but repmgr user is not a superuser"));
log_detail(_("superuser permission required to disable standbys on failover"));
/* GRANT ALTER SYSTEM available from PostgreSQL 15 */ return false;
if (PQserverVersion(conn) >= 150000)
{
initPQExpBuffer(&query);
appendPQExpBufferStr(&query,
" SELECT pg_catalog.has_parameter_privilege('wal_retrieve_retry_interval', 'ALTER SYSTEM') ");
res = PQexec(conn, query.data);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
log_db_error(conn, query.data,
_("can_disable_walsender(): unable to query user parameter privileges"));
}
else
{
has_alter_system_priv = atobool(PQgetvalue(res, 0, 0));
}
termPQExpBuffer(&query);
PQclear(res);
}
if (has_alter_system_priv == false)
{
log_warning(_("\"standby_disconnect_on_failover\" specified, but repmgr user is not authorized to perform ALTER SYSTEM wal_retrieve_retry_interval"));
if (PQserverVersion(conn) >= 150000)
{
log_detail(_("superuser or ALTER SYSTEM wal_retrieve_retry_interval permission required to disable standbys on failover"));
}
else
{
log_detail(_("superuser permission required to disable standbys on failover"));
}
}
return has_alter_system_priv;
} }
/* /*
@@ -2024,13 +1947,13 @@ connection_has_pg_monitor_role(PGconn *conn, const char *subrole)
initPQExpBuffer(&query); initPQExpBuffer(&query);
appendPQExpBufferStr(&query, appendPQExpBufferStr(&query,
" SELECT CASE " " SELECT CASE "
" WHEN pg_catalog.pg_has_role('pg_monitor','USAGE') " " WHEN pg_catalog.pg_has_role('pg_monitor','MEMBER') "
" THEN TRUE "); " THEN TRUE ");
if (subrole != NULL) if (subrole != NULL)
{ {
appendPQExpBuffer(&query, appendPQExpBuffer(&query,
" WHEN pg_catalog.pg_has_role('%s','USAGE') " " WHEN pg_catalog.pg_has_role('%s','MEMBER') "
" THEN TRUE ", " THEN TRUE ",
subrole); subrole);
} }
@@ -2537,10 +2460,7 @@ get_repmgr_extension_status(PGconn *conn, t_extension_versions *extversions)
/* node management functions */ /* node management functions */
/* ========================= */ /* ========================= */
/* /* assumes superuser connection */
* Assumes the connection can execute CHECKPOINT command.
* A check can be executed via 'can_execute_checkpoint' function.
*/
void void
checkpoint(PGconn *conn) checkpoint(PGconn *conn)
{ {

View File

@@ -453,7 +453,6 @@ TimeLineHistoryEntry *get_timeline_history(PGconn *repl_conn, TimeLineID tli);
pid_t get_wal_receiver_pid(PGconn *conn); pid_t get_wal_receiver_pid(PGconn *conn);
/* user/role information functions */ /* user/role information functions */
bool can_execute_checkpoint(PGconn *conn);
bool can_execute_pg_promote(PGconn *conn); bool can_execute_pg_promote(PGconn *conn);
bool can_disable_walsender(PGconn *conn); bool can_disable_walsender(PGconn *conn);
bool connection_has_pg_monitor_role(PGconn *conn, const char *subrole); bool connection_has_pg_monitor_role(PGconn *conn, const char *subrole);

View File

@@ -16,26 +16,11 @@
</para> </para>
<!-- remember to update the release date in ../repmgr_version.h.in --> <!-- remember to update the release date in ../repmgr_version.h.in -->
<sect1 id="release-5.5.0">
<title>Release 5.5.0</title>
<para><emphasis>Wed 20 November, 2024</emphasis></para>
<para>
&repmgr; 5.5.0 is a major release.
</para>
<para>
This release adds support for PostgreSQL 17
</para>
<para>
Fixes warnings detected by the -Wshadow gcc flag added in PostgreSQL 16.
</para>
</sect1>
<sect1 id="release-5.4.1"> <sect1 id="release-5.4.1">
<title id="release-current">Release 5.4.1</title> <title id="release-current">Release 5.4.1</title>
<para><emphasis>Tue 04 Jul, 2023</emphasis></para> <para><emphasis>Tue 04 July, 2023</emphasis></para>
<para> <para>
&repmgr; 5.4.1 is a minor release providing ... &repmgr; 5.4.1 is a minor release providing a fix for witness metadata update
</para> </para>
<sect2> <sect2>
<title>Bug fixes</title> <title>Bug fixes</title>

View File

@@ -79,10 +79,6 @@
Alternatively the meta-role <varname>pg_monitor</varname> can be granted, which includes membership Alternatively the meta-role <varname>pg_monitor</varname> can be granted, which includes membership
of the above predefined roles. of the above predefined roles.
</para> </para>
<para>
PostgreSQL 15 introduced the <varname>pg_checkpoint</varname> predefined role which allows a
non-superuser &repmgr; database user to perform a CHECKPOINT command.
</para>
<para> <para>
Membership of these roles can be granted with e.g. <command>GRANT pg_read_all_stats TO repmgr</command>. Membership of these roles can be granted with e.g. <command>GRANT pg_read_all_stats TO repmgr</command>.
</para> </para>
@@ -152,8 +148,6 @@
<link linkend="repmgr-standby-switchover">repmgr standby switchover</link>. This can only <link linkend="repmgr-standby-switchover">repmgr standby switchover</link>. This can only
be executed by a superuser; if the &repmgr; user is not a superuser, be executed by a superuser; if the &repmgr; user is not a superuser,
the <option>-S</option>/<option>--superuser</option> should be used. the <option>-S</option>/<option>--superuser</option> should be used.
From PostgreSQL 15 the <varname>pg_checkpoint</varname> predefined role removes the need of
superuser permissions to perform <command>CHECKPOINT</command> command.
</simpara> </simpara>
<simpara> <simpara>
If &repmgr; is not able to execute <command>CHECKPOINT</command>, If &repmgr; is not able to execute <command>CHECKPOINT</command>,
@@ -165,10 +159,8 @@
<simpara> <simpara>
The <command>ALTER SYSTEM</command> is executed by &repmgrd; if The <command>ALTER SYSTEM</command> is executed by &repmgrd; if
<varname>standby_disconnect_on_failover</varname> is set to <literal>true</literal> in <varname>standby_disconnect_on_failover</varname> is set to <literal>true</literal> in
<filename>repmgr.conf</filename>. Until PostgreSQL 14 <command>ALTER SYSTEM</command> can only be executed by <filename>repmgr.conf</filename>. <command>ALTER SYSTEM</command> can only be executed by
a superuser; if the &repmgr; user is not a superuser, this functionality will not be available. a superuser; if the &repmgr; user is not a superuser, this functionality will not be available.
From PostgreSQL 15 a specific ALTER SYSTEM privilege can be granted with e.g.
<command>GRANT ALTER SYSTEM ON PARAMETER wal_retrieve_retry_interval TO repmgr</command>.
</simpara> </simpara>
</listitem> </listitem>
</itemizedlist> </itemizedlist>

View File

@@ -14,7 +14,7 @@
</para> </para>
<para> <para>
&repmgr; &repmgrversion; is compatible with all supported PostgreSQL versions from 13.x. See &repmgr; &repmgrversion; is compatible with all PostgreSQL versions from 10. See
section <link linkend="install-compatibility-matrix">&repmgr; compatibility matrix</link> section <link linkend="install-compatibility-matrix">&repmgr; compatibility matrix</link>
for an overview of version compatibility. for an overview of version compatibility.
</para> </para>
@@ -45,7 +45,7 @@
of incompatibilities. of incompatibilities.
</simpara> </simpara>
<simpara> <simpara>
If different &quot;major&quot; &repmgr; versions (e.g. 5.2.x and &repmgrversion;) If different &quot;major&quot; &repmgr; versions (e.g. 4.1.x and &repmgrversion;.x)
are installed on different nodes, in the best case &repmgr; (in particular &repmgrd;) are installed on different nodes, in the best case &repmgr; (in particular &repmgrd;)
will not run. In the worst case, you will end up with a broken cluster. will not run. In the worst case, you will end up with a broken cluster.
</simpara> </simpara>
@@ -89,6 +89,7 @@
which PostgreSQL version. which PostgreSQL version.
</para> </para>
<table id="repmgr-compatibility-matrix"> <table id="repmgr-compatibility-matrix">
<title>&repmgr; compatibility matrix</title> <title>&repmgr; compatibility matrix</title>
@@ -116,16 +117,16 @@
<tbody> <tbody>
<row> <row>
<entry> <entry>
&repmgr; 5.5 &repmgr; 5.4
</entry> </entry>
<entry> <entry>
Yes YES
</entry> </entry>
<entry> <entry>
<link linkend="release-5.5.0">&repmgrversion;</link> (&releasedate;) <link linkend="release-current">&repmgrversion;</link> (&releasedate;)
</entry> </entry>
<entry> <entry>
12, 13, 15, 16, 17 10, 11, 12, 13, 14, 15, 16
</entry> </entry>
<entry> <entry>
&nbsp; &nbsp;
@@ -134,31 +135,13 @@
<row> <row>
<entry> <entry>
&repmgr; 5.4.1 &repmgr; 5.3
</entry> </entry>
<entry> <entry>
Yes YES
</entry> </entry>
<entry> <entry>
<link linkend="release-5.4.1">5.4.1</link> (2023-04-04) <link linkend="release-current">&repmgrversion;</link> (&releasedate;)
</entry>
<entry>
10, 11, 12, 13, 15
</entry>
<entry>
&nbsp;
</entry>
</row>
<row>
<entry>
&repmgr; 5.3.1
</entry>
<entry>
Yes
</entry>
<entry>
<link linkend="release-5.3.1">5.3.1</link> (2022-02-15)
</entry> </entry>
<entry> <entry>
9.4, 9.5, 9.6, 10, 11, 12, 13, 14, 15 9.4, 9.5, 9.6, 10, 11, 12, 13, 14, 15
@@ -173,7 +156,7 @@
&repmgr; 5.2 &repmgr; 5.2
</entry> </entry>
<entry> <entry>
No NO
</entry> </entry>
<entry> <entry>
<link linkend="release-5.2.1">5.2.1</link> (2020-12-07) <link linkend="release-5.2.1">5.2.1</link> (2020-12-07)
@@ -191,7 +174,7 @@
&repmgr; 5.1 &repmgr; 5.1
</entry> </entry>
<entry> <entry>
No NO
</entry> </entry>
<entry> <entry>
<link linkend="release-5.1.0">5.1.0</link> (2020-04-13) <link linkend="release-5.1.0">5.1.0</link> (2020-04-13)
@@ -209,7 +192,7 @@
&repmgr; 5.0 &repmgr; 5.0
</entry> </entry>
<entry> <entry>
No NO
</entry> </entry>
<entry> <entry>
<link linkend="release-5.0">5.0</link> (2019-10-15) <link linkend="release-5.0">5.0</link> (2019-10-15)
@@ -228,7 +211,7 @@
&repmgr; 4.x &repmgr; 4.x
</entry> </entry>
<entry> <entry>
No NO
</entry> </entry>
<entry> <entry>
<link linkend="release-4.4">4.4</link> (2019-06-27) <link linkend="release-4.4">4.4</link> (2019-06-27)
@@ -246,7 +229,7 @@
&repmgr; 3.x &repmgr; 3.x
</entry> </entry>
<entry> <entry>
No NO
</entry> </entry>
<entry> <entry>
<ulink url="https://repmgr.org/release-notes-3.3.2.html">3.3.2</ulink> (2017-05-30) <ulink url="https://repmgr.org/release-notes-3.3.2.html">3.3.2</ulink> (2017-05-30)
@@ -264,7 +247,7 @@
&repmgr; 2.x &repmgr; 2.x
</entry> </entry>
<entry> <entry>
No NO
</entry> </entry>
<entry> <entry>
<ulink url="https://repmgr.org/release-notes-2.0.3.html">2.0.3</ulink> (2015-04-16) <ulink url="https://repmgr.org/release-notes-2.0.3.html">2.0.3</ulink> (2015-04-16)
@@ -283,12 +266,12 @@
<important> <important>
<para> <para>
The &repmgr; series older than 5.x are no longer maintained or supported. The &repmgr; 2.x and 3.x series are no longer maintained or supported.
We strongly recommend upgrading to the latest &repmgr; version. We strongly recommend upgrading to the latest &repmgr; version.
</para> </para>
<para> <para>
Following the release of &repmgr; 5.0, there will be no further releases of Following the release of &repmgr; 5.0, there will be no further releases of
the &repmgr; 4.x series or older. Note that &repmgr; 5.x is an incremental development the &repmgr; 4.x series. Note that &repmgr; 5.x is an incremental development
of the 4.x series and &repmgr; 4.x users should upgrade to this as soon as possible. of the 4.x series and &repmgr; 4.x users should upgrade to this as soon as possible.
</para> </para>
</important> </important>

View File

@@ -1,9 +1,9 @@
<!-- doc/legal.xml --> <!-- doc/legal.xml -->
<date>2025</date> <date>2022</date>
<copyright> <copyright>
<year>2010-2025</year> <year>2010-2022</year>
<holder>EDB</holder> <holder>EDB</holder>
</copyright> </copyright>
@@ -11,7 +11,7 @@
<title>Legal Notice</title> <title>Legal Notice</title>
<para> <para>
<productname>repmgr</productname> is Copyright &copy; 2010-2025 <productname>repmgr</productname> is Copyright &copy; 2010-2022
by EDB All rights reserved. by EDB All rights reserved.
</para> </para>

View File

@@ -77,8 +77,7 @@
</para> </para>
<para> <para>
Note that a superuser connection is required to be able to execute the Note that a superuser connection is required to be able to execute the
<command>CHECKPOINT</command> command. From PostgreSQL 15 the <varname>pg_checkpoint</varname> <command>CHECKPOINT</command> command.
predefined role removes the need for superuser permissions to perform <command>CHECKPOINT</command> command.
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>

View File

@@ -79,8 +79,7 @@
<para> <para>
Note that <command>CHECKPOINT</command> requires database superuser permissions to execute. Note that <command>CHECKPOINT</command> requires database superuser permissions to execute.
If the <literal>repmgr</literal> user is not a superuser, the name of a superuser should be If the <literal>repmgr</literal> user is not a superuser, the name of a superuser should be
provided with the <option>-S</option>/<option>--superuser</option> option. From PostgreSQL 15 the <varname>pg_checkpoint</varname> provided with the <option>-S</option>/<option>--superuser</option> option.
predefined role removes the need for superuser permissions to perform <command>CHECKPOINT</command> command.
</para> </para>
<para> <para>
If &repmgr; is unable to execute the <command>CHECKPOINT</command> command, the switchover If &repmgr; is unable to execute the <command>CHECKPOINT</command> command, the switchover

View File

@@ -26,7 +26,7 @@
<abstract> <abstract>
<para> <para>
This is the official documentation of &repmgr; &repmgrversion; for This is the official documentation of &repmgr; &repmgrversion; for
use with PostgreSQL 12 - PostgreSQL 17. use with PostgreSQL 10 - PostgreSQL 16.
</para> </para>
<para> <para>
&repmgr; is being continually developed and we strongly recommend using the &repmgr; is being continually developed and we strongly recommend using the

View File

@@ -279,9 +279,7 @@
<note> <note>
<para> <para>
<option>standby_disconnect_on_failover</option> is available with PostgreSQL 9.5 and later. <option>standby_disconnect_on_failover</option> is available with PostgreSQL 9.5 and later.
Until PostgreSQL 14 this requires that the <literal>repmgr</literal> database user is a superuser. Additionally this requires that the <literal>repmgr</literal> database user is a superuser.
From PostgreSQL 15 a specific ALTER SYSTEM privilege can be granted to the <literal>repmgr</literal> database
user with e.g. <command>GRANT ALTER SYSTEM ON PARAMETER wal_retrieve_retry_interval TO repmgr</command>.
</para> </para>
</note> </note>
<para> <para>

View File

@@ -1,2 +0,0 @@
-- complain if script is sourced in psql, rather than via CREAT EXTENSION
\echo Use "CREATE EXTENSION repmgr" to load this file. \quit

View File

@@ -1,191 +0,0 @@
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION repmgr" to load this file. \quit
CREATE TABLE repmgr.nodes (
node_id INTEGER PRIMARY KEY,
upstream_node_id INTEGER NULL REFERENCES nodes (node_id) DEFERRABLE,
active BOOLEAN NOT NULL DEFAULT TRUE,
node_name TEXT NOT NULL,
type TEXT NOT NULL CHECK (type IN('primary','standby','witness','bdr')),
location TEXT NOT NULL DEFAULT 'default',
priority INT NOT NULL DEFAULT 100,
conninfo TEXT NOT NULL,
repluser VARCHAR(63) NOT NULL,
slot_name TEXT NULL,
config_file TEXT NOT NULL
);
SELECT pg_catalog.pg_extension_config_dump('repmgr.nodes', '');
CREATE TABLE repmgr.events (
node_id INTEGER NOT NULL,
event TEXT NOT NULL,
successful BOOLEAN NOT NULL DEFAULT TRUE,
event_timestamp TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
details TEXT NULL
);
SELECT pg_catalog.pg_extension_config_dump('repmgr.events', '');
CREATE TABLE repmgr.monitoring_history (
primary_node_id INTEGER NOT NULL,
standby_node_id INTEGER NOT NULL,
last_monitor_time TIMESTAMP WITH TIME ZONE NOT NULL,
last_apply_time TIMESTAMP WITH TIME ZONE,
last_wal_primary_location PG_LSN NOT NULL,
last_wal_standby_location PG_LSN,
replication_lag BIGINT NOT NULL,
apply_lag BIGINT NOT NULL
);
CREATE INDEX idx_monitoring_history_time
ON repmgr.monitoring_history (last_monitor_time, standby_node_id);
SELECT pg_catalog.pg_extension_config_dump('repmgr.monitoring_history', '');
CREATE VIEW repmgr.show_nodes AS
SELECT n.node_id,
n.node_name,
n.active,
n.upstream_node_id,
un.node_name AS upstream_node_name,
n.type,
n.priority,
n.conninfo
FROM repmgr.nodes n
LEFT JOIN repmgr.nodes un
ON un.node_id = n.upstream_node_id;
CREATE TABLE repmgr.voting_term (
term INT NOT NULL
);
CREATE UNIQUE INDEX voting_term_restrict
ON repmgr.voting_term ((TRUE));
CREATE RULE voting_term_delete AS
ON DELETE TO repmgr.voting_term
DO INSTEAD NOTHING;
/* ================= */
/* repmgrd functions */
/* ================= */
/* monitoring functions */
CREATE FUNCTION set_local_node_id(INT)
RETURNS VOID
AS 'MODULE_PATHNAME', 'repmgr_set_local_node_id'
LANGUAGE C STRICT;
CREATE FUNCTION get_local_node_id()
RETURNS INT
AS 'MODULE_PATHNAME', 'repmgr_get_local_node_id'
LANGUAGE C STRICT;
CREATE FUNCTION standby_set_last_updated()
RETURNS TIMESTAMP WITH TIME ZONE
AS 'MODULE_PATHNAME', 'repmgr_standby_set_last_updated'
LANGUAGE C STRICT;
CREATE FUNCTION standby_get_last_updated()
RETURNS TIMESTAMP WITH TIME ZONE
AS 'MODULE_PATHNAME', 'repmgr_standby_get_last_updated'
LANGUAGE C STRICT;
CREATE FUNCTION set_upstream_last_seen(INT)
RETURNS VOID
AS 'MODULE_PATHNAME', 'repmgr_set_upstream_last_seen'
LANGUAGE C STRICT;
CREATE FUNCTION get_upstream_last_seen()
RETURNS INT
AS 'MODULE_PATHNAME', 'repmgr_get_upstream_last_seen'
LANGUAGE C STRICT;
CREATE FUNCTION get_upstream_node_id()
RETURNS INT
AS 'MODULE_PATHNAME', 'repmgr_get_upstream_node_id'
LANGUAGE C STRICT;
CREATE FUNCTION set_upstream_node_id(INT)
RETURNS VOID
AS 'MODULE_PATHNAME', 'repmgr_set_upstream_node_id'
LANGUAGE C STRICT;
/* failover functions */
CREATE FUNCTION notify_follow_primary(INT)
RETURNS VOID
AS 'MODULE_PATHNAME', 'repmgr_notify_follow_primary'
LANGUAGE C STRICT;
CREATE FUNCTION get_new_primary()
RETURNS INT
AS 'MODULE_PATHNAME', 'repmgr_get_new_primary'
LANGUAGE C STRICT;
CREATE FUNCTION reset_voting_status()
RETURNS VOID
AS 'MODULE_PATHNAME', 'repmgr_reset_voting_status'
LANGUAGE C STRICT;
CREATE FUNCTION get_repmgrd_pid()
RETURNS INT
AS 'MODULE_PATHNAME', 'get_repmgrd_pid'
LANGUAGE C STRICT;
CREATE FUNCTION get_repmgrd_pidfile()
RETURNS TEXT
AS 'MODULE_PATHNAME', 'get_repmgrd_pidfile'
LANGUAGE C STRICT;
CREATE FUNCTION set_repmgrd_pid(INT, TEXT)
RETURNS VOID
AS 'MODULE_PATHNAME', 'set_repmgrd_pid'
LANGUAGE C CALLED ON NULL INPUT;
CREATE FUNCTION repmgrd_is_running()
RETURNS BOOL
AS 'MODULE_PATHNAME', 'repmgrd_is_running'
LANGUAGE C STRICT;
CREATE FUNCTION repmgrd_pause(BOOL)
RETURNS VOID
AS 'MODULE_PATHNAME', 'repmgrd_pause'
LANGUAGE C STRICT;
CREATE FUNCTION repmgrd_is_paused()
RETURNS BOOL
AS 'MODULE_PATHNAME', 'repmgrd_is_paused'
LANGUAGE C STRICT;
CREATE FUNCTION get_wal_receiver_pid()
RETURNS INT
AS 'MODULE_PATHNAME', 'repmgr_get_wal_receiver_pid'
LANGUAGE C STRICT;
/* views */
CREATE VIEW repmgr.replication_status AS
SELECT m.primary_node_id, m.standby_node_id, n.node_name AS standby_name,
n.type AS node_type, n.active, last_monitor_time,
CASE WHEN n.type='standby' THEN m.last_wal_primary_location ELSE NULL END AS last_wal_primary_location,
m.last_wal_standby_location,
CASE WHEN n.type='standby' THEN pg_catalog.pg_size_pretty(m.replication_lag) ELSE NULL END AS replication_lag,
CASE WHEN n.type='standby' THEN
CASE WHEN replication_lag > 0 THEN age(now(), m.last_apply_time) ELSE '0'::INTERVAL END
ELSE NULL
END AS replication_time_lag,
CASE WHEN n.type='standby' THEN pg_catalog.pg_size_pretty(m.apply_lag) ELSE NULL END AS apply_lag,
AGE(NOW(), CASE WHEN pg_catalog.pg_is_in_recovery() THEN repmgr.standby_get_last_updated() ELSE m.last_monitor_time END) AS communication_time_lag
FROM repmgr.monitoring_history m
JOIN repmgr.nodes n ON m.standby_node_id = n.node_id
WHERE (m.standby_node_id, m.last_monitor_time) IN (
SELECT m1.standby_node_id, MAX(m1.last_monitor_time)
FROM repmgr.monitoring_history m1 GROUP BY 1
);

View File

@@ -394,6 +394,7 @@ do_node_status(void)
if (node_info.inactive_replication_slots > 0) if (node_info.inactive_replication_slots > 0)
{ {
KeyValueList inactive_replication_slots = {NULL, NULL}; KeyValueList inactive_replication_slots = {NULL, NULL};
KeyValueListCell *cell = NULL;
(void) get_inactive_replication_slots(conn, &inactive_replication_slots); (void) get_inactive_replication_slots(conn, &inactive_replication_slots);
@@ -523,6 +524,8 @@ do_node_status(void)
if (node_info.inactive_replication_slots) if (node_info.inactive_replication_slots)
{ {
KeyValueList inactive_replication_slots = {NULL, NULL}; KeyValueList inactive_replication_slots = {NULL, NULL};
KeyValueListCell *cell = NULL;
(void) get_inactive_replication_slots(conn, &inactive_replication_slots); (void) get_inactive_replication_slots(conn, &inactive_replication_slots);
for (cell = inactive_replication_slots.head; cell; cell = cell->next) for (cell = inactive_replication_slots.head; cell; cell = cell->next)
{ {
@@ -2362,25 +2365,18 @@ do_node_service(void)
conn = establish_db_connection_by_params(&source_conninfo, true); conn = establish_db_connection_by_params(&source_conninfo, true);
} }
if (can_execute_checkpoint(conn) == false) if (is_superuser_connection(conn, NULL) == false)
{ {
if (runtime_options.dry_run == true) if (runtime_options.dry_run == true)
{ {
log_warning(_("a CHECKPOINT would be issued here but no authorized connection is available")); log_warning(_("a CHECKPOINT would be issued here but no superuser connection is available"));
} }
else else
{ {
log_warning(_("an authorized connection is required to issue a CHECKPOINT")); log_warning(_("a superuser connection is required to issue a CHECKPOINT"));
} }
if (PQserverVersion(conn) >= 150000) log_hint(_("provide a superuser with -S/--superuser"));
{
log_hint(_("provide a superuser with -S/--superuser or grant pg_checkpoint role to repmgr user"));
}
else
{
log_hint(_("provide a superuser with -S/--superuser"));
}
} }
else else
{ {
@@ -2543,7 +2539,6 @@ do_node_rejoin(void)
int server_version_num = UNKNOWN_SERVER_VERSION_NUM; int server_version_num = UNKNOWN_SERVER_VERSION_NUM;
bool hide_standby_signal = false; bool hide_standby_signal = false;
KeyValueListCell *cell = NULL;
PQExpBufferData command; PQExpBufferData command;
PQExpBufferData command_output; PQExpBufferData command_output;
PQExpBufferData follow_output; PQExpBufferData follow_output;
@@ -2963,7 +2958,7 @@ do_node_rejoin(void)
else else
{ {
while ((slotdir_ent = readdir(slotdir)) != NULL) { while ((slotdir_ent = readdir(slotdir)) != NULL) {
struct stat local_statbuf; struct stat statbuf;
PQExpBufferData slotdir_ent_path; PQExpBufferData slotdir_ent_path;
if (strcmp(slotdir_ent->d_name, ".") == 0 || strcmp(slotdir_ent->d_name, "..") == 0) if (strcmp(slotdir_ent->d_name, ".") == 0 || strcmp(slotdir_ent->d_name, "..") == 0)
@@ -2976,7 +2971,7 @@ do_node_rejoin(void)
slotdir_path.data, slotdir_path.data,
slotdir_ent->d_name); slotdir_ent->d_name);
if (stat(slotdir_ent_path.data, &local_statbuf) == 0 && !S_ISDIR(local_statbuf.st_mode)) if (stat(slotdir_ent_path.data, &statbuf) == 0 && !S_ISDIR(statbuf.st_mode))
{ {
termPQExpBuffer(&slotdir_ent_path); termPQExpBuffer(&slotdir_ent_path);
continue; continue;
@@ -3107,6 +3102,7 @@ do_node_rejoin(void)
else else
{ {
KeyValueList inactive_replication_slots = {NULL, NULL}; KeyValueList inactive_replication_slots = {NULL, NULL};
KeyValueListCell *cell = NULL;
int inactive_count = 0; int inactive_count = 0;
PQExpBufferData slotinfo; PQExpBufferData slotinfo;

View File

@@ -235,38 +235,6 @@ do_primary_register(void)
return; return;
} }
static inline void reset_node_info(t_node_info *info)
{
info->node_id = NODE_NOT_FOUND;
info->upstream_node_id = NO_UPSTREAM_NODE;
info->type = UNKNOWN;
info->node_name[0] = '\0';
info->upstream_node_name[0] = '\0';
info->conninfo[0] = '\0';
info->repluser[0] = '\0';
info->priority = DEFAULT_PRIORITY;
info->active = true;
info->slot_name[0] = '\0';
info->config_file[0] = '\0';
info->last_wal_receive_lsn = InvalidXLogRecPtr;
info->node_status = NODE_STATUS_UNKNOWN;
info->recovery_type = RECTYPE_UNKNOWN;
info->monitoring_state = MS_NORMAL;
info->conn = NULL;
info->details[0] = '\0';
info->reachable = true;
info->attached = true;
/* various statistics */
info->max_wal_senders = -1;
info->attached_wal_receivers = -1;
info->max_replication_slots = -1;
info->total_replication_slots = -1;
info->active_replication_slots = -1;
info->inactive_replication_slots = -1;
info->replication_info = NULL;
strlcpy(info->location, DEFAULT_LOCATION, sizeof(info->location));
}
/* /*
* do_primary_unregister() * do_primary_unregister()
@@ -468,7 +436,7 @@ do_primary_unregister(void)
} }
else if (recovery_type == RECTYPE_PRIMARY) else if (recovery_type == RECTYPE_PRIMARY)
{ {
reset_node_info(&primary_node_info); t_node_info primary_node_info = T_NODE_INFO_INITIALIZER;
bool primary_record_found = false; bool primary_record_found = false;
primary_record_found = get_primary_node_record(primary_conn, &primary_node_info); primary_record_found = get_primary_node_record(primary_conn, &primary_node_info);

View File

@@ -535,7 +535,7 @@ do_standby_clone(void)
if (external_config_files == true) if (external_config_files == true)
{ {
r = 0; int r;
PQExpBufferData msg; PQExpBufferData msg;
initPQExpBuffer(&msg); initPQExpBuffer(&msg);
@@ -762,7 +762,7 @@ do_standby_clone(void)
if (mode == pg_basebackup && runtime_options.verify_backup == true) if (mode == pg_basebackup && runtime_options.verify_backup == true)
{ {
PQExpBufferData command; PQExpBufferData command;
r = 0; int r;
struct stat st; struct stat st;
initPQExpBuffer(&command); initPQExpBuffer(&command);
@@ -3927,6 +3927,7 @@ do_standby_switchover(void)
if (PQserverVersion(local_conn) < 130000 && is_wal_replay_paused(local_conn, false) == true) if (PQserverVersion(local_conn) < 130000 && is_wal_replay_paused(local_conn, false) == true)
{ {
ReplInfo replication_info;
init_replication_info(&replication_info); init_replication_info(&replication_info);
if (get_replication_info(local_conn, STANDBY, &replication_info) == false) if (get_replication_info(local_conn, STANDBY, &replication_info) == false)
@@ -4783,7 +4784,7 @@ do_standby_switchover(void)
{ {
NodeInfoListCell *cell = NULL; NodeInfoListCell *cell = NULL;
ItemList repmgrd_connection_errors = {NULL, NULL}; ItemList repmgrd_connection_errors = {NULL, NULL};
i = 0; int i = 0;
int unreachable_node_count = 0; int unreachable_node_count = 0;
get_all_node_records(local_conn, &all_nodes); get_all_node_records(local_conn, &all_nodes);
@@ -5098,6 +5099,8 @@ do_standby_switchover(void)
/* database server could not be contacted */ /* database server could not be contacted */
if (ping_res == PQPING_NO_RESPONSE || ping_res == PQPING_NO_ATTEMPT) if (ping_res == PQPING_NO_RESPONSE || ping_res == PQPING_NO_ATTEMPT)
{ {
bool command_success;
/* /*
* remote server can't be contacted at protocol level - that * remote server can't be contacted at protocol level - that
* doesn't necessarily mean it's shut down, so we'll ask its * doesn't necessarily mean it's shut down, so we'll ask its
@@ -5285,7 +5288,7 @@ do_standby_switchover(void)
checkpoint_conn = superuser_conn; checkpoint_conn = superuser_conn;
} }
if (can_execute_checkpoint(checkpoint_conn) == true) if (is_superuser_connection(checkpoint_conn, NULL) == true)
{ {
log_notice(_("issuing CHECKPOINT on node \"%s\" (ID: %i) "), log_notice(_("issuing CHECKPOINT on node \"%s\" (ID: %i) "),
config_file_options.node_name, config_file_options.node_name,
@@ -5294,16 +5297,7 @@ do_standby_switchover(void)
} }
else else
{ {
log_warning(_("no authorized connection available, unable to issue CHECKPOINT")); log_warning(_("no superuser connection available, unable to issue CHECKPOINT"));
if (PQserverVersion(local_conn) >= 150000)
{
log_hint(_("provide a superuser with -S/--superuser or grant pg_checkpoint role to repmgr user"));
}
else
{
log_hint(_("provide a superuser with -S/--superuser"));
}
} }
} }
@@ -5675,7 +5669,7 @@ do_standby_switchover(void)
{ {
ItemList repmgrd_unpause_errors = {NULL, NULL}; ItemList repmgrd_unpause_errors = {NULL, NULL};
NodeInfoListCell *cell = NULL; NodeInfoListCell *cell = NULL;
i = 0; int i = 0;
int error_node_count = 0; int error_node_count = 0;
for (cell = all_nodes.head; cell; cell = cell->next) for (cell = all_nodes.head; cell; cell = cell->next)
@@ -6510,12 +6504,12 @@ check_upstream_config(PGconn *conn, int server_version_num, t_node_info *upstrea
if (mode == pg_basebackup) if (mode == pg_basebackup)
{ {
PGconn **connections; PGconn **connections;
int available_wal_senders; int i;
int min_replication_connections = 1; int available_wal_senders;
int possible_replication_connections = 0; int min_replication_connections = 1;
i = 0; int possible_replication_connections = 0;
t_conninfo_param_list repl_conninfo = T_CONNINFO_PARAM_LIST_INITIALIZER; t_conninfo_param_list repl_conninfo = T_CONNINFO_PARAM_LIST_INITIALIZER;
/* /*
@@ -8477,6 +8471,7 @@ check_sibling_nodes(NodeInfoList *sibling_nodes, SiblingNodeStats *sibling_nodes
if (sibling_nodes->node_count > 0) if (sibling_nodes->node_count > 0)
{ {
PQExpBufferData nodes; PQExpBufferData nodes;
NodeInfoListCell *cell;
initPQExpBuffer(&nodes); initPQExpBuffer(&nodes);

View File

@@ -70,11 +70,7 @@
#include "repmgr-action-service.h" #include "repmgr-action-service.h"
#include "repmgr-action-daemon.h" #include "repmgr-action-daemon.h"
#if (PG_VERSION_NUM >= 170000)
#include <common/file_utils.h> /* for PG_TEMP_FILE_PREFIX */
#else
#include <storage/fd.h> /* for PG_TEMP_FILE_PREFIX */ #include <storage/fd.h> /* for PG_TEMP_FILE_PREFIX */
#endif
/* globally available variables * /* globally available variables *
* ============================ */ * ============================ */

View File

@@ -12,7 +12,7 @@
# #
# For details on the configuration file format see the documentation at: # For details on the configuration file format see the documentation at:
# #
# https://repmgr.org/docs/current/configuration-file.html#CONFIGURATION-FILE-FORMAT # https://repmgr.org/docs/current/configuration-file.html#CONFIGURATION-FILE-FORMAT
# #
# ============================================================================= # =============================================================================
# Required configuration items # Required configuration items
@@ -76,7 +76,7 @@
#location='default' # An arbitrary string defining the location of the node; this #location='default' # An arbitrary string defining the location of the node; this
# is used during failover to check visibility of the # is used during failover to check visibility of the
# current primary node. For further details see: # current primary node. For further details see:
# https://repmgr.org/docs/current/repmgrd-network-split.html # https://repmgr.org/docs/current/repmgrd-network-split.html
#use_replication_slots=no # whether to use physical replication slots #use_replication_slots=no # whether to use physical replication slots
# NOTE: when using replication slots, # NOTE: when using replication slots,
@@ -181,8 +181,8 @@
#pg_ctl_options='' # Options to append to "pg_ctl" #pg_ctl_options='' # Options to append to "pg_ctl"
#pg_basebackup_options='' # Options to append to "pg_basebackup" #pg_basebackup_options='' # Options to append to "pg_basebackup"
# (Note: when cloning from Barman, repmgr will honour any # (Note: when cloning from Barman, repmgr will honour any
# --waldir/--xlogdir setting present in "pg_basebackup_options" # --waldir/--xlogdir setting present in "pg_basebackup_options"
#rsync_options='' # Options to append to "rsync" #rsync_options='' # Options to append to "rsync"
ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh" ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
@@ -212,8 +212,8 @@ ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
#recovery_min_apply_delay= # If provided, "recovery_min_apply_delay" will be set to #recovery_min_apply_delay= # If provided, "recovery_min_apply_delay" will be set to
# this value (PostgreSQL 9.4 and later). Value can be # this value (PostgreSQL 9.4 and later). Value can be
# an integer representing milliseconds, or a string # an integer representing milliseconds, or a string
# representing a period of time (e.g. '5 min'). # representing a period of time (e.g. '5 min').
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
@@ -299,7 +299,7 @@ ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
# a value of zero prevents the node being promoted to primary # a value of zero prevents the node being promoted to primary
# (default: 100) # (default: 100)
#connection_check_type='ping' # How to check availability of the upstream node; valid options: #connection_check_type=ping # How to check availability of the upstream node; valid options:
# 'ping': use PQping() to check if the node is accepting connections # 'ping': use PQping() to check if the node is accepting connections
# 'connection': attempt to make a new connection to the node # 'connection': attempt to make a new connection to the node
# 'query': execute an SQL statement on the node via the existing connection # 'query': execute an SQL statement on the node via the existing connection
@@ -340,31 +340,22 @@ ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
#repmgrd_exit_on_inactive_node=false # If "true", and the node record is marked as "inactive", abort repmgrd startup #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 #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 # disconnect their WAL receivers before electing a new primary
# Can be true in PostgreSQL 9.5 and later only. Until PostgreSQL 14 repmgr user must be a superuser to use this. # (PostgreSQL 9.5 and later only; repmgr user must be a superuser for this)
# From PostgreSQL 15 repmgr must be a superuser or have 'ALTER SYSTEM wal_retrieve_retry_interval' privilege.
# (see: https://repmgr.org/docs/current/repmgrd-standby-disconnection-on-failover.html )
#sibling_nodes_disconnect_timeout=30 # If "standby_disconnect_on_failover" is true, the maximum length of time #sibling_nodes_disconnect_timeout=30 # If "standby_disconnect_on_failover" is true, the maximum length of time
# (in seconds) to wait for other standbys to confirm they have disconnected their # (in seconds) to wait for other standbys to confirm they have disconnected their
# WAL receivers # WAL receivers
#primary_visibility_consensus=false # If "true", only continue with failover if no standbys have seen #primary_visibility_consensus=false # If "true", only continue with failover if no standbys have seen
# the primary node recently. *Must* be the same on all nodes. # the primary node recently. *Must* be the same on all nodes.
#always_promote=false # Always promote a node, even if repmgr metadata is outdated #always_promote=false # Always promote a node, even if repmgr metadata is outdated
#failover_validation_command='' # Script to execute for an external mechanism to validate the failover #failover_validation_command='' # Script to execute for an external mechanism to validate the failover
# decision made by repmgrd. Each of the following parameter placeholders # decision made by repmgrd. One or both of the following parameter placeholders
# should be provided, which will be replaced by repmgrd with the appropriate value: # should be provided, which will be replaced by repmgrd with the appropriate
# %n (node_id) # value: %n (node_id), %a (node_name). *Must* be the same on all nodes.
# %a (node_name)
# %v (number of visible nodes)
# %u (number of shared upstream nodes)
# %t (total number of nodes)
# *Must* be the same on all nodes.
#election_rerun_interval=15 # if "failover_validation_command" is set, and the command returns #election_rerun_interval=15 # if "failover_validation_command" is set, and the command returns
# an error, pause the specified amount of seconds before rerunning the election. # an error, pause the specified amount of seconds before rerunning the election.
#
# The following items are relevant for repmgrd running on the primary, # The following items are relevant for repmgrd running on the primary,
# and will be ignored on non-primary nodes. # and will be ignored on non-primary nodes
# (see: https://repmgr.org/docs/current/repmgrd-primary-child-disconnection.html )
#child_nodes_check_interval=5 # Interval (in seconds) to check for attached child nodes (standbys) #child_nodes_check_interval=5 # Interval (in seconds) to check for attached child nodes (standbys)
#child_nodes_connected_min_count=-1 # Minimum number of child nodes which must remain connected, otherwise #child_nodes_connected_min_count=-1 # Minimum number of child nodes which must remain connected, otherwise
# disconnection command will be triggered # disconnection command will be triggered
@@ -372,7 +363,6 @@ ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
# (ignored if "child_nodes_connected_min_count" set) # (ignored if "child_nodes_connected_min_count" set)
#child_nodes_disconnect_timeout=30 # Interval between child node disconnection and disconnection command execution #child_nodes_disconnect_timeout=30 # Interval between child node disconnection and disconnection command execution
#child_nodes_disconnect_command='' # Command to execute if child node disconnection detected #child_nodes_disconnect_command='' # Command to execute if child node disconnection detected
#child_nodes_connected_include_witness=false # Whether to count the witness node (if in use) as a child node when determining whether to execute child_nodes_disconnect_command.
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# service control commands # service control commands
@@ -395,20 +385,20 @@ ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
# #
# For example, to use systemd, you can set # For example, to use systemd, you can set
# #
# service_start_command = 'sudo systemctl start postgresql-16' # service_start_command = 'sudo systemctl start postgresql-9.6'
# (...) # (...)
# #
# and then use the following sudoers configuration: # and then use the following sudoers configuration:
# #
# # this is required when running sudo over ssh without -t: # # this is required when running sudo over ssh without -t:
# Defaults:postgres !requiretty # Defaults:postgres !requiretty
# postgres ALL = NOPASSWD: /usr/bin/systemctl stop postgresql-16, \ # postgres ALL = NOPASSWD: /usr/bin/systemctl stop postgresql-9.6, \
# /usr/bin/systemctl start postgresql-16, \ # /usr/bin/systemctl start postgresql-9.6, \
# /usr/bin/systemctl restart postgresql-16 # /usr/bin/systemctl restart postgresql-9.6
# #
# Debian/Ubuntu users: use "sudo pg_ctlcluster" to execute service control commands. # Debian/Ubuntu users: use "sudo pg_ctlcluster" to execute service control commands.
# #
# For further details, see: https://repmgr.org/docs/current/configuration-file-service-commands.html # For more details, see: https://repmgr.org/docs/current/configuration-file-service-commands.html
#service_start_command = '' #service_start_command = ''
#service_stop_command = '' #service_stop_command = ''
@@ -451,3 +441,4 @@ ssh_options='-q -o ConnectTimeout=10' # Options to append to "ssh"
# "repmgr standby switchover" to warn about potential # "repmgr standby switchover" to warn about potential
# issues with shutting down the demotion candidate. # issues with shutting down the demotion candidate.

View File

@@ -1,6 +1,6 @@
# repmgr extension # repmgr extension
comment = 'Replication manager for PostgreSQL' comment = 'Replication manager for PostgreSQL'
default_version = '5.5' default_version = '5.4'
module_pathname = '$libdir/repmgr' module_pathname = '$libdir/repmgr'
relocatable = false relocatable = false
schema = repmgr schema = repmgr

View File

@@ -1,7 +1,7 @@
#define REPMGR_VERSION_DATE "2024-11-20" #define REPMGR_VERSION_DATE ""
#define REPMGR_VERSION "5.5.0" #define REPMGR_VERSION "5.4.1"
#define REPMGR_VERSION_NUM 50500 #define REPMGR_VERSION_NUM 50401
#define REPMGR_EXTENSION_VERSION "5.5.0" #define REPMGR_EXTENSION_VERSION "5.4"
#define REPMGR_EXTENSION_NUM 50500 #define REPMGR_EXTENSION_NUM 50400
#define REPMGR_RELEASE_DATE "2024-XX-XX" #define REPMGR_RELEASE_DATE "2023-07-04"
#define PG_ACTUAL_VERSION_NUM #define PG_ACTUAL_VERSION_NUM

View File

@@ -1359,8 +1359,6 @@ monitor_streaming_standby(void)
MonitoringState local_monitoring_state = MS_NORMAL; MonitoringState local_monitoring_state = MS_NORMAL;
instr_time local_degraded_monitoring_start; instr_time local_degraded_monitoring_start;
bool upstream_check_result;
int degraded_monitoring_elapsed;
int last_known_upstream_node_id = UNKNOWN_NODE_ID; int last_known_upstream_node_id = UNKNOWN_NODE_ID;
log_debug("monitor_streaming_standby()"); log_debug("monitor_streaming_standby()");
@@ -1549,6 +1547,7 @@ monitor_streaming_standby(void)
while (true) while (true)
{ {
bool upstream_check_result;
log_verbose(LOG_DEBUG, "checking %s", upstream_node_info.conninfo); log_verbose(LOG_DEBUG, "checking %s", upstream_node_info.conninfo);
@@ -1771,7 +1770,8 @@ monitor_streaming_standby(void)
if (monitoring_state == MS_DEGRADED) if (monitoring_state == MS_DEGRADED)
{ {
degraded_monitoring_elapsed = calculate_elapsed(degraded_monitoring_start); int degraded_monitoring_elapsed = calculate_elapsed(degraded_monitoring_start);
bool upstream_check_result;
if (config_file_options.degraded_monitoring_timeout > 0 if (config_file_options.degraded_monitoring_timeout > 0
&& degraded_monitoring_elapsed > config_file_options.degraded_monitoring_timeout) && degraded_monitoring_elapsed > config_file_options.degraded_monitoring_timeout)
@@ -1894,6 +1894,7 @@ monitor_streaming_standby(void)
*/ */
if (failover_state == FAILOVER_STATE_PROMOTION_FAILED) if (failover_state == FAILOVER_STATE_PROMOTION_FAILED)
{ {
int degraded_monitoring_elapsed;
int former_upstream_node_id = local_node_info.upstream_node_id; int former_upstream_node_id = local_node_info.upstream_node_id;
NodeInfoList sibling_nodes = T_NODE_INFO_LIST_INITIALIZER; NodeInfoList sibling_nodes = T_NODE_INFO_LIST_INITIALIZER;
PQExpBufferData event_details; PQExpBufferData event_details;
@@ -1952,7 +1953,7 @@ monitor_streaming_standby(void)
if (local_node_info.type == PRIMARY) if (local_node_info.type == PRIMARY)
{ {
degraded_monitoring_elapsed = calculate_elapsed(degraded_monitoring_start); int degraded_monitoring_elapsed = calculate_elapsed(degraded_monitoring_start);
log_notice(_("resuming monitoring as primary node after %i seconds"), log_notice(_("resuming monitoring as primary node after %i seconds"),
degraded_monitoring_elapsed); degraded_monitoring_elapsed);