mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-23 15:16:29 +00:00
Compare commits
1 Commits
v5.5.0rc1
...
fix-local-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bccef890f0 |
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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.4.1) supports all PostgreSQL versions from
|
||||||
13 to 17. Despite it could be used with some older ones, some features might not
|
10 to 16.
|
||||||
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.
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
AC_INIT([repmgr], [5.5.0], [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-2024, EnterpriseDB Corporation])
|
AC_COPYRIGHT([Copyright (c) 2010-2021, EnterpriseDB Corporation])
|
||||||
|
|
||||||
AC_CONFIG_HEADER(config.h)
|
AC_CONFIG_HEADER(config.h)
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
191
repmgr--5.5.sql
191
repmgr--5.5.sql
@@ -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
|
|
||||||
);
|
|
||||||
@@ -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)
|
||||||
{
|
{
|
||||||
@@ -2543,7 +2546,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 +2965,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 +2978,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 +3109,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;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -5675,7 +5678,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 +6513,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 +8480,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);
|
||||||
|
|
||||||
|
|||||||
@@ -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 *
|
||||||
* ============================ */
|
* ============================ */
|
||||||
|
|||||||
@@ -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.4dev"
|
||||||
#define REPMGR_VERSION_NUM 50500
|
#define REPMGR_VERSION_NUM 50400
|
||||||
#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 "2022-XX-XX"
|
||||||
#define PG_ACTUAL_VERSION_NUM
|
#define PG_ACTUAL_VERSION_NUM
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user