mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-23 07:06:30 +00:00
Compare commits
57 Commits
v5.3.2epas
...
dev/drop_r
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4a73bdcfd0 | ||
|
|
e27f213949 | ||
|
|
cce5ca2245 | ||
|
|
6f87d2c61e | ||
|
|
c0763c94c8 | ||
|
|
ea689d17b5 | ||
|
|
de343f0cbe | ||
|
|
e6f1b8c279 | ||
|
|
8e5f469fa1 | ||
|
|
73cb3abd44 | ||
|
|
a3c77cac41 | ||
|
|
706d570790 | ||
|
|
433bde82e8 | ||
|
|
8f5319ce75 | ||
|
|
4c05307da1 | ||
|
|
743e0e5480 | ||
|
|
35c4ba1fbe | ||
|
|
30082eab02 | ||
|
|
d9d60fa420 | ||
|
|
2756d6fd94 | ||
|
|
bb63fb08d0 | ||
|
|
9508673e00 | ||
|
|
3e3803fa32 | ||
|
|
8119aef378 | ||
|
|
35c8a53790 | ||
|
|
1c7fec9a1a | ||
|
|
3b8294e4cb | ||
|
|
f5e42e1851 | ||
|
|
f7b9e11d6f | ||
|
|
197c87d13b | ||
|
|
67e2e8e613 | ||
|
|
c6f137d438 | ||
|
|
6cd41aaaf6 | ||
|
|
b4dca347b4 | ||
|
|
2e1d1f9a57 | ||
|
|
fa851ea38f | ||
|
|
593bffb18f | ||
|
|
8a36cc3b2d | ||
|
|
2733579a76 | ||
|
|
947d14979f | ||
|
|
b8cb1feb49 | ||
|
|
5de74d9e18 | ||
|
|
2dce8e14f9 | ||
|
|
81f9c0ebd0 | ||
|
|
9f53d45c74 | ||
|
|
aef5a4f8cf | ||
|
|
580d112d3d | ||
|
|
6ba27a9c6b | ||
|
|
51e7025747 | ||
|
|
ded20be505 | ||
|
|
e7e62f7f35 | ||
|
|
3870768d80 | ||
|
|
16349d95e9 | ||
|
|
bba282a131 | ||
|
|
02c29dc860 | ||
|
|
7c5efe2baa | ||
|
|
b2756806d9 |
37
.github/workflows/sonarqube-scan.yml
vendored
Normal file
37
.github/workflows/sonarqube-scan.yml
vendored
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
name: SonarQube Scan
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
workflow_dispatch:
|
||||||
|
jobs:
|
||||||
|
sonarQube:
|
||||||
|
name: SonarQube-Job
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
|
||||||
|
- name: Checkout source repo
|
||||||
|
uses: actions/checkout@v1
|
||||||
|
with:
|
||||||
|
ref: '${{ github.head_ref }}'
|
||||||
|
|
||||||
|
- name: Checkout GitHub Action Repo
|
||||||
|
uses: actions/checkout@master
|
||||||
|
with:
|
||||||
|
repository: EnterpriseDB/edb-github-actions.git
|
||||||
|
ref: master
|
||||||
|
token: ${{ secrets.GH_SLONIK }}
|
||||||
|
path: .github/actions/edb-github-actions
|
||||||
|
|
||||||
|
- name: SonarQube Scan
|
||||||
|
uses: ./.github/actions/edb-github-actions/sonarqube
|
||||||
|
with:
|
||||||
|
REPO_NAME: '${{github.event.repository.name}}'
|
||||||
|
SONAR_PROJECT_KEY: EnterpriseDB_repmgr
|
||||||
|
SONAR_URL: '${{secrets.SONARQUBE_URL}}'
|
||||||
|
SONAR_LOGIN: '${{secrets.SONARQUBE_LOGIN}}'
|
||||||
|
PULL_REQUEST_KEY: '${{github.event.number}}'
|
||||||
|
PULL_REQUEST_BRANCH: '${{github.head_ref}}'
|
||||||
|
PULL_REQUEST_BASE_BRANCH: '${{github.base_ref}}'
|
||||||
|
REPO_DEFAULT_BRANCH: '${{github.event.repository.default_branch}}'
|
||||||
|
REPO_EXCLUDE_FILES: '*properties*,**/src/test/**/*,**/*.sql,**/docs/**/*,**/*/*.java'
|
||||||
18
.github/workflows/sonarqube/configure-env.sh
vendored
Executable file
18
.github/workflows/sonarqube/configure-env.sh
vendored
Executable file
@@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
DEBIAN_FRONTEND=noninteractive sudo apt-get -y install debhelper curl autoconf zlib1g-dev \
|
||||||
|
libedit-dev libxml2-dev libxslt1-dev libkrb5-dev libssl-dev libpam0g-dev systemtap-sdt-dev \
|
||||||
|
libselinux1-dev build-essential bison apt-utils lsb-release devscripts \
|
||||||
|
software-properties-common git shellcheck flex
|
||||||
|
|
||||||
|
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
|
||||||
|
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
|
||||||
|
sudo apt-get update
|
||||||
|
|
||||||
|
sudo apt-get -y install libpq-dev postgresql-13 postgresql-server-dev-13
|
||||||
|
|
||||||
|
./configure
|
||||||
|
|
||||||
|
export PG_CONFIG=/usr/bin/pg_config
|
||||||
|
|
||||||
|
/home/buildfarm/sonar/depends/build-wrapper-linux-x86/build-wrapper-linux-x86-64 --out-dir build_wrapper_output_directory make
|
||||||
2
HISTORY
2
HISTORY
@@ -3,8 +3,6 @@
|
|||||||
node check: fix --downstream --nagios output; GitHub #749 (Ian)
|
node check: fix --downstream --nagios output; GitHub #749 (Ian)
|
||||||
repmgrd: ensure witness node marked active (hslightdb)
|
repmgrd: ensure witness node marked active (hslightdb)
|
||||||
repmgrd: improve walsender disable check (Ian)
|
repmgrd: improve walsender disable check (Ian)
|
||||||
general: ensure replication slots can be dropped by a
|
|
||||||
replication-only user (Ian)
|
|
||||||
|
|
||||||
5.3.1 2022-02-15
|
5.3.1 2022-02-15
|
||||||
repmgrd: fixes for potential connection leaks (hslightdb)
|
repmgrd: fixes for potential connection leaks (hslightdb)
|
||||||
|
|||||||
@@ -30,7 +30,9 @@ DATA = \
|
|||||||
repmgr--5.1--5.2.sql \
|
repmgr--5.1--5.2.sql \
|
||||||
repmgr--5.2.sql \
|
repmgr--5.2.sql \
|
||||||
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.4.sql
|
||||||
|
|
||||||
REGRESS = repmgr_extension
|
REGRESS = repmgr_extension
|
||||||
|
|
||||||
|
|||||||
18
configure
vendored
18
configure
vendored
@@ -1,6 +1,6 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated by GNU Autoconf 2.69 for repmgr 5.3.0.
|
# Generated by GNU Autoconf 2.69 for repmgr 5.4.0.
|
||||||
#
|
#
|
||||||
# Report bugs to <repmgr@googlegroups.com>.
|
# Report bugs to <repmgr@googlegroups.com>.
|
||||||
#
|
#
|
||||||
@@ -582,8 +582,8 @@ MAKEFLAGS=
|
|||||||
# Identity of this package.
|
# Identity of this package.
|
||||||
PACKAGE_NAME='repmgr'
|
PACKAGE_NAME='repmgr'
|
||||||
PACKAGE_TARNAME='repmgr'
|
PACKAGE_TARNAME='repmgr'
|
||||||
PACKAGE_VERSION='5.3.0'
|
PACKAGE_VERSION='5.4.0'
|
||||||
PACKAGE_STRING='repmgr 5.3.0'
|
PACKAGE_STRING='repmgr 5.4.0'
|
||||||
PACKAGE_BUGREPORT='repmgr@googlegroups.com'
|
PACKAGE_BUGREPORT='repmgr@googlegroups.com'
|
||||||
PACKAGE_URL='https://repmgr.org/'
|
PACKAGE_URL='https://repmgr.org/'
|
||||||
|
|
||||||
@@ -1181,7 +1181,7 @@ if test "$ac_init_help" = "long"; then
|
|||||||
# Omit some internal or obsolete options to make the list less imposing.
|
# Omit some internal or obsolete options to make the list less imposing.
|
||||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||||
cat <<_ACEOF
|
cat <<_ACEOF
|
||||||
\`configure' configures repmgr 5.3.0 to adapt to many kinds of systems.
|
\`configure' configures repmgr 5.4.0 to adapt to many kinds of systems.
|
||||||
|
|
||||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||||
|
|
||||||
@@ -1242,7 +1242,7 @@ fi
|
|||||||
|
|
||||||
if test -n "$ac_init_help"; then
|
if test -n "$ac_init_help"; then
|
||||||
case $ac_init_help in
|
case $ac_init_help in
|
||||||
short | recursive ) echo "Configuration of repmgr 5.3.0:";;
|
short | recursive ) echo "Configuration of repmgr 5.4.0:";;
|
||||||
esac
|
esac
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
|
|
||||||
@@ -1316,7 +1316,7 @@ fi
|
|||||||
test -n "$ac_init_help" && exit $ac_status
|
test -n "$ac_init_help" && exit $ac_status
|
||||||
if $ac_init_version; then
|
if $ac_init_version; then
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
repmgr configure 5.3.0
|
repmgr configure 5.4.0
|
||||||
generated by GNU Autoconf 2.69
|
generated by GNU Autoconf 2.69
|
||||||
|
|
||||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||||
@@ -1335,7 +1335,7 @@ cat >config.log <<_ACEOF
|
|||||||
This file contains any messages produced by compilers while
|
This file contains any messages produced by compilers while
|
||||||
running configure, to aid debugging if configure makes a mistake.
|
running configure, to aid debugging if configure makes a mistake.
|
||||||
|
|
||||||
It was created by repmgr $as_me 5.3.0, which was
|
It was created by repmgr $as_me 5.4.0, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
$ $0 $@
|
$ $0 $@
|
||||||
@@ -2487,7 +2487,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|||||||
# report actual input values of CONFIG_FILES etc. instead of their
|
# report actual input values of CONFIG_FILES etc. instead of their
|
||||||
# values after options handling.
|
# values after options handling.
|
||||||
ac_log="
|
ac_log="
|
||||||
This file was extended by repmgr $as_me 5.3.0, which was
|
This file was extended by repmgr $as_me 5.4.0, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
CONFIG_FILES = $CONFIG_FILES
|
||||||
@@ -2550,7 +2550,7 @@ _ACEOF
|
|||||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||||
ac_cs_version="\\
|
ac_cs_version="\\
|
||||||
repmgr config.status 5.3.0
|
repmgr config.status 5.4.0
|
||||||
configured by $0, generated by GNU Autoconf 2.69,
|
configured by $0, generated by GNU Autoconf 2.69,
|
||||||
with options \\"\$ac_cs_config\\"
|
with options \\"\$ac_cs_config\\"
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
AC_INIT([repmgr], [5.3.2], [repmgr@googlegroups.com], [repmgr], [https://repmgr.org/])
|
AC_INIT([repmgr], [5.4.0], [repmgr@googlegroups.com], [repmgr], [https://repmgr.org/])
|
||||||
|
|
||||||
AC_COPYRIGHT([Copyright (c) 2010-2022, EnterpriseDB Corporation])
|
AC_COPYRIGHT([Copyright (c) 2010-2021, EnterpriseDB Corporation])
|
||||||
|
|
||||||
AC_CONFIG_HEADER(config.h)
|
AC_CONFIG_HEADER(config.h)
|
||||||
|
|
||||||
|
|||||||
14
dbutils.c
14
dbutils.c
@@ -2139,7 +2139,13 @@ server_in_exclusive_backup_mode(PGconn *conn)
|
|||||||
{
|
{
|
||||||
BackupState backup_state = BACKUP_STATE_UNKNOWN;
|
BackupState backup_state = BACKUP_STATE_UNKNOWN;
|
||||||
const char *sqlquery = "SELECT pg_catalog.pg_is_in_backup()";
|
const char *sqlquery = "SELECT pg_catalog.pg_is_in_backup()";
|
||||||
PGresult *res = PQexec(conn, sqlquery);
|
PGresult *res = NULL;
|
||||||
|
|
||||||
|
/* Exclusive backup removed from PostgreSQL 15 */
|
||||||
|
if (PQserverVersion(conn) >= 150000)
|
||||||
|
return BACKUP_STATE_NO_BACKUP;
|
||||||
|
|
||||||
|
res = PQexec(conn, sqlquery);
|
||||||
|
|
||||||
if (PQresultStatus(res) != PGRES_TUPLES_OK)
|
if (PQresultStatus(res) != PGRES_TUPLES_OK)
|
||||||
{
|
{
|
||||||
@@ -4610,17 +4616,17 @@ drop_replication_slot_replprot(PGconn *repl_conn, char *slot_name)
|
|||||||
initPQExpBuffer(&query);
|
initPQExpBuffer(&query);
|
||||||
|
|
||||||
appendPQExpBuffer(&query,
|
appendPQExpBuffer(&query,
|
||||||
"DROP_REPLICATION_SLOT %s;",
|
"DROP_REPLICATION_SLOT %s",
|
||||||
slot_name);
|
slot_name);
|
||||||
|
|
||||||
log_verbose(LOG_DEBUG, "drop_replication_slot_replprot():\n %s", query.data);
|
log_verbose(LOG_DEBUG, "drop_replication_slot_replprot():\n %s", query.data);
|
||||||
|
|
||||||
res = PQexec(repl_conn, query.data);
|
res = PQexec(repl_conn, query.data);
|
||||||
|
|
||||||
if (PQresultStatus(res) != PGRES_TUPLES_OK || !PQntuples(res))
|
if (PQresultStatus(res) != PGRES_TUPLES_OK)
|
||||||
{
|
{
|
||||||
log_db_error(repl_conn, query.data,
|
log_db_error(repl_conn, query.data,
|
||||||
_("drop_replication_slot_replprot(): unable to drop replication slot \"%s\""),
|
_("drop_replication_slot_sql(): unable to drop replication slot \"%s\""),
|
||||||
slot_name);
|
slot_name);
|
||||||
|
|
||||||
success = false;
|
success = false;
|
||||||
|
|||||||
@@ -18,13 +18,10 @@
|
|||||||
<!-- 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.3.2">
|
<sect1 id="release-5.3.2">
|
||||||
<title id="release-current">Release 5.3.2</title>
|
<title id="release-current">Release 5.3.2</title>
|
||||||
<para><emphasis>Wed 25 May, 2022</emphasis></para>
|
<para><emphasis>??? ??? ???, 2022</emphasis></para>
|
||||||
<para>
|
<para>
|
||||||
&repmgr; 5.3.2 is a minor release.
|
&repmgr; 5.3.2 is a minor release.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
|
||||||
Any running &repmgrd; instances should be restarted following this upgrade.
|
|
||||||
</para>
|
|
||||||
<para>
|
<para>
|
||||||
If upgrading from &repmgr; 5.2.1 or earlier, a PostgreSQL restart <emphasis>is</emphasis> required.
|
If upgrading from &repmgr; 5.2.1 or earlier, a PostgreSQL restart <emphasis>is</emphasis> required.
|
||||||
</para>
|
</para>
|
||||||
@@ -64,13 +61,6 @@
|
|||||||
&repmgr; is a superuser before attempting to disable the WAL receiver.
|
&repmgr; is a superuser before attempting to disable the WAL receiver.
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
If the &repmgr; user is a non-superuser, and a replication-only user exists,
|
|
||||||
ensure redundant replication slots are dropped correctly even
|
|
||||||
if the <option>-S/--superuser</option> option is not provided.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
</para>
|
</para>
|
||||||
</sect2>
|
</sect2>
|
||||||
@@ -213,8 +203,7 @@
|
|||||||
risk of clashes with other shared libraries.
|
risk of clashes with other shared libraries.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
This does not affect user-facing SQL functions. However an upgrade
|
This does not affect user-facing SQL functions. Howe
|
||||||
of the installed extension version is required.
|
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
|
|||||||
2
repmgr--5.3--5.4.sql
Normal file
2
repmgr--5.3--5.4.sql
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
-- complain if script is sourced in psql, rather than via CREAT EXTENSION
|
||||||
|
\echo Use "CREATE EXTENSION repmgr" to load this file. \quit
|
||||||
192
repmgr--5.4.sql
Normal file
192
repmgr--5.4.sql
Normal file
@@ -0,0 +1,192 @@
|
|||||||
|
-- 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
|
||||||
|
);
|
||||||
|
|
||||||
@@ -3192,6 +3192,11 @@ copy_remote_files(char *host, char *remote_user, char *remote_path,
|
|||||||
" --exclude=pg_xlog/* --exclude=pg_log/*");
|
" --exclude=pg_xlog/* --exclude=pg_log/*");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* From PostgreSQL 15, the core server no longer uses pg_stat_tmp,
|
||||||
|
* but some extensions (e.g. pg_stat_statements) may still do, so
|
||||||
|
* keep excluding it.
|
||||||
|
*/
|
||||||
appendPQExpBufferStr(&rsync_flags,
|
appendPQExpBufferStr(&rsync_flags,
|
||||||
" --exclude=pg_stat_tmp/*");
|
" --exclude=pg_stat_tmp/*");
|
||||||
|
|
||||||
@@ -3868,17 +3873,19 @@ drop_replication_slot_if_exists(PGconn *conn, int node_id, char *slot_name)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
bool use_replication_protocol = false;
|
bool use_replication_protocol = false;
|
||||||
PGconn *slot_conn = _get_replication_slot_connection(conn,
|
PGconn *slot_conn = NULL;
|
||||||
replication_user,
|
|
||||||
&use_replication_protocol);
|
slot_conn = _get_replication_slot_connection(conn,
|
||||||
|
replication_user,
|
||||||
|
&use_replication_protocol);
|
||||||
|
|
||||||
if (use_replication_protocol == true)
|
if (use_replication_protocol == true)
|
||||||
{
|
{
|
||||||
success = drop_replication_slot_replprot(slot_conn, slot_name);
|
success = drop_replication_slot_replprot(conn, slot_name);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
success = drop_replication_slot_sql(slot_conn, slot_name);
|
success = drop_replication_slot_sql(conn, slot_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (success == true)
|
if (success == true)
|
||||||
@@ -3958,13 +3965,9 @@ _determine_replication_slot_user(PGconn *conn, t_node_info *upstream_node_record
|
|||||||
/* This should never happen */
|
/* This should never happen */
|
||||||
log_error("unable to determine replication slot user");
|
log_error("unable to determine replication slot user");
|
||||||
if (upstream_node_record != NULL)
|
if (upstream_node_record != NULL)
|
||||||
{
|
|
||||||
log_debug("%i %s %s", upstream_node_record->node_id, upstream_node_record->repluser, PQuser(conn));
|
log_debug("%i %s %s", upstream_node_record->node_id, upstream_node_record->repluser, PQuser(conn));
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
log_debug("upstream_node_record not provided");
|
log_debug("upstream_node_record not provided");
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3981,13 +3984,13 @@ _get_replication_slot_connection(PGconn *conn, char *replication_user, bool *use
|
|||||||
switch (ReplicationSlotUser)
|
switch (ReplicationSlotUser)
|
||||||
{
|
{
|
||||||
case USER_TYPE_UNKNOWN:
|
case USER_TYPE_UNKNOWN:
|
||||||
log_error("unable to determine user for managing replication slots");
|
log_error("unable to determine user for replication slot creation");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
case REPMGR_USER:
|
case REPMGR_USER:
|
||||||
slot_conn = conn;
|
slot_conn = conn;
|
||||||
log_verbose(LOG_INFO, _("managing replication slot as user \"%s\""),
|
log_info(_("creating replication slot as user \"%s\""),
|
||||||
PQuser(conn));
|
PQuser(conn));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case REPLICATION_USER_NODE:
|
case REPLICATION_USER_NODE:
|
||||||
@@ -3998,7 +4001,7 @@ _get_replication_slot_connection(PGconn *conn, char *replication_user, bool *use
|
|||||||
true);
|
true);
|
||||||
if (slot_conn == NULL || PQstatus(slot_conn) != CONNECTION_OK)
|
if (slot_conn == NULL || PQstatus(slot_conn) != CONNECTION_OK)
|
||||||
{
|
{
|
||||||
log_error(_("unable to manage replication connection as replication user \"%s\""),
|
log_error(_("unable to create replication connection as user \"%s\""),
|
||||||
runtime_options.replication_user);
|
runtime_options.replication_user);
|
||||||
log_detail("%s", PQerrorMessage(slot_conn));
|
log_detail("%s", PQerrorMessage(slot_conn));
|
||||||
|
|
||||||
@@ -4006,8 +4009,8 @@ _get_replication_slot_connection(PGconn *conn, char *replication_user, bool *use
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
*use_replication_protocol = true;
|
*use_replication_protocol = true;
|
||||||
log_verbose(LOG_INFO, _("managing replication slot as replication user \"%s\""),
|
log_info(_("creating replication slot as replication user \"%s\""),
|
||||||
replication_user);
|
replication_user);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -4018,7 +4021,7 @@ _get_replication_slot_connection(PGconn *conn, char *replication_user, bool *use
|
|||||||
false);
|
false);
|
||||||
if (slot_conn == NULL || PQstatus(slot_conn )!= CONNECTION_OK)
|
if (slot_conn == NULL || PQstatus(slot_conn )!= CONNECTION_OK)
|
||||||
{
|
{
|
||||||
log_error(_("unable to create superuser connection as user \"%s\""),
|
log_error(_("unable to create super connection as user \"%s\""),
|
||||||
runtime_options.superuser);
|
runtime_options.superuser);
|
||||||
log_detail("%s", PQerrorMessage(slot_conn));
|
log_detail("%s", PQerrorMessage(slot_conn));
|
||||||
|
|
||||||
@@ -4026,8 +4029,8 @@ _get_replication_slot_connection(PGconn *conn, char *replication_user, bool *use
|
|||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
log_verbose(LOG_INFO, _("creating replication slot as superuser \"%s\""),
|
log_info(_("creating replication slot as superuser \"%s\""),
|
||||||
runtime_options.superuser);
|
runtime_options.superuser);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
48
repmgr.c
48
repmgr.c
@@ -80,11 +80,17 @@ typedef struct repmgrdSharedState
|
|||||||
|
|
||||||
static repmgrdSharedState *shared_state = NULL;
|
static repmgrdSharedState *shared_state = NULL;
|
||||||
|
|
||||||
|
#if (PG_VERSION_NUM >= 150000)
|
||||||
|
static shmem_request_hook_type prev_shmem_request_hook = NULL;
|
||||||
|
#endif
|
||||||
static shmem_startup_hook_type prev_shmem_startup_hook = NULL;
|
static shmem_startup_hook_type prev_shmem_startup_hook = NULL;
|
||||||
|
|
||||||
|
|
||||||
void _PG_init(void);
|
void _PG_init(void);
|
||||||
|
void _PG_fini(void);
|
||||||
|
|
||||||
|
#if (PG_VERSION_NUM >= 150000)
|
||||||
|
static void repmgr_shmem_request(void);
|
||||||
|
#endif
|
||||||
static void repmgr_shmem_startup(void);
|
static void repmgr_shmem_startup(void);
|
||||||
|
|
||||||
PG_FUNCTION_INFO_V1(repmgr_set_local_node_id);
|
PG_FUNCTION_INFO_V1(repmgr_set_local_node_id);
|
||||||
@@ -116,24 +122,62 @@ _PG_init(void)
|
|||||||
if (!process_shared_preload_libraries_in_progress)
|
if (!process_shared_preload_libraries_in_progress)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
#if (PG_VERSION_NUM < 150000)
|
||||||
RequestAddinShmemSpace(MAXALIGN(sizeof(repmgrdSharedState)));
|
RequestAddinShmemSpace(MAXALIGN(sizeof(repmgrdSharedState)));
|
||||||
|
|
||||||
#if (PG_VERSION_NUM >= 90600)
|
#if (PG_VERSION_NUM >= 90600)
|
||||||
RequestNamedLWLockTranche(TRANCHE_NAME, 1);
|
RequestNamedLWLockTranche(TRANCHE_NAME, 1);
|
||||||
#else
|
#else
|
||||||
RequestAddinLWLocks(1);
|
RequestAddinLWLocks(1);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Install hooks.
|
* Install hooks.
|
||||||
*/
|
*/
|
||||||
|
#if (PG_VERSION_NUM >= 150000)
|
||||||
|
prev_shmem_request_hook = shmem_request_hook;
|
||||||
|
shmem_request_hook = repmgr_shmem_request;
|
||||||
|
#endif
|
||||||
|
|
||||||
prev_shmem_startup_hook = shmem_startup_hook;
|
prev_shmem_startup_hook = shmem_startup_hook;
|
||||||
shmem_startup_hook = repmgr_shmem_startup;
|
shmem_startup_hook = repmgr_shmem_startup;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* shmem_startup hook: allocate or attach to shared memory,
|
* Module unload callback
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
_PG_fini(void)
|
||||||
|
{
|
||||||
|
/* Uninstall hook */
|
||||||
|
#if (PG_VERSION_NUM >= 150000)
|
||||||
|
shmem_request_hook = prev_shmem_request_hook;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
shmem_startup_hook = prev_shmem_startup_hook;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (PG_VERSION_NUM >= 150000)
|
||||||
|
/*
|
||||||
|
* shmem_requst_hook: request shared memory
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
repmgr_shmem_request(void)
|
||||||
|
{
|
||||||
|
if (prev_shmem_request_hook)
|
||||||
|
prev_shmem_request_hook();
|
||||||
|
|
||||||
|
RequestAddinShmemSpace(MAXALIGN(sizeof(repmgrdSharedState)));
|
||||||
|
|
||||||
|
RequestNamedLWLockTranche(TRANCHE_NAME, 1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* shmem_ hook: allocate or attach to shared memory,
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
repmgr_shmem_startup(void)
|
repmgr_shmem_startup(void)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# repmgr extension
|
# repmgr extension
|
||||||
comment = 'Replication manager for PostgreSQL'
|
comment = 'Replication manager for PostgreSQL'
|
||||||
default_version = '5.3'
|
default_version = '5.4'
|
||||||
module_pathname = '$libdir/repmgr'
|
module_pathname = '$libdir/repmgr'
|
||||||
relocatable = false
|
relocatable = false
|
||||||
schema = repmgr
|
schema = repmgr
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#define REPMGR_VERSION_DATE ""
|
#define REPMGR_VERSION_DATE ""
|
||||||
#define REPMGR_VERSION "5.3.2"
|
#define REPMGR_VERSION "5.4dev"
|
||||||
#define REPMGR_VERSION_NUM 50302
|
#define REPMGR_VERSION_NUM 50400
|
||||||
#define REPMGR_EXTENSION_VERSION "5.3"
|
#define REPMGR_EXTENSION_VERSION "5.4"
|
||||||
#define REPMGR_EXTENSION_NUM 50300
|
#define REPMGR_EXTENSION_NUM 50400
|
||||||
#define REPMGR_RELEASE_DATE "2022-05-25"
|
#define REPMGR_RELEASE_DATE "2022-XX-XX"
|
||||||
#define PG_ACTUAL_VERSION_NUM
|
#define PG_ACTUAL_VERSION_NUM
|
||||||
|
|||||||
Reference in New Issue
Block a user