mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-25 16:16:29 +00:00
repmgrd: during failover, check if a node was already promoted
Previously, repmgrd assumed that during a failover, there would not already be another primary node. However it's possible a node was promoted manually. While this is not a desirable situation, it's conceivable this could happen in the wild, so we should check for it and react accordingly. Also sanity-check that the follow target can actually be followed. Addresses issue raised in GitHub #420.
This commit is contained in:
18
dbutils.c
18
dbutils.c
@@ -4895,6 +4895,7 @@ void
|
||||
init_replication_info(ReplInfo *replication_info)
|
||||
{
|
||||
memset(replication_info->current_timestamp, 0, sizeof(replication_info->current_timestamp));
|
||||
replication_info->in_recovery = false;
|
||||
replication_info->last_wal_receive_lsn = InvalidXLogRecPtr;
|
||||
replication_info->last_wal_replay_lsn = InvalidXLogRecPtr;
|
||||
memset(replication_info->last_xact_replay_timestamp, 0, sizeof(replication_info->last_xact_replay_timestamp));
|
||||
@@ -4915,6 +4916,7 @@ get_replication_info(PGconn *conn, t_server_type node_type, ReplInfo *replicatio
|
||||
initPQExpBuffer(&query);
|
||||
appendPQExpBufferStr(&query,
|
||||
" SELECT ts, "
|
||||
" in_recovery, "
|
||||
" last_wal_receive_lsn, "
|
||||
" last_wal_replay_lsn, "
|
||||
" last_xact_replay_timestamp, "
|
||||
@@ -4932,6 +4934,7 @@ get_replication_info(PGconn *conn, t_server_type node_type, ReplInfo *replicatio
|
||||
" upstream_last_seen "
|
||||
" FROM ( "
|
||||
" SELECT CURRENT_TIMESTAMP AS ts, "
|
||||
" pg_catalog.pg_is_in_recovery() AS in_recovery, "
|
||||
" pg_catalog.pg_last_xact_replay_timestamp() AS last_xact_replay_timestamp, ");
|
||||
|
||||
|
||||
@@ -4998,13 +5001,14 @@ get_replication_info(PGconn *conn, t_server_type node_type, ReplInfo *replicatio
|
||||
else
|
||||
{
|
||||
strncpy(replication_info->current_timestamp, PQgetvalue(res, 0, 0), MAXLEN);
|
||||
replication_info->last_wal_receive_lsn = parse_lsn(PQgetvalue(res, 0, 1));
|
||||
replication_info->last_wal_replay_lsn = parse_lsn(PQgetvalue(res, 0, 2));
|
||||
strncpy(replication_info->last_xact_replay_timestamp, PQgetvalue(res, 0, 3), MAXLEN);
|
||||
replication_info->replication_lag_time = atoi(PQgetvalue(res, 0, 4));
|
||||
replication_info->receiving_streamed_wal = atobool(PQgetvalue(res, 0, 5));
|
||||
replication_info->wal_replay_paused = atobool(PQgetvalue(res, 0, 6));
|
||||
replication_info->upstream_last_seen = atoi(PQgetvalue(res, 0, 7));
|
||||
replication_info->in_recovery = atobool(PQgetvalue(res, 0, 1));
|
||||
replication_info->last_wal_receive_lsn = parse_lsn(PQgetvalue(res, 0, 2));
|
||||
replication_info->last_wal_replay_lsn = parse_lsn(PQgetvalue(res, 0, 3));
|
||||
strncpy(replication_info->last_xact_replay_timestamp, PQgetvalue(res, 0, 4), MAXLEN);
|
||||
replication_info->replication_lag_time = atoi(PQgetvalue(res, 0, 5));
|
||||
replication_info->receiving_streamed_wal = atobool(PQgetvalue(res, 0, 6));
|
||||
replication_info->wal_replay_paused = atobool(PQgetvalue(res, 0, 7));
|
||||
replication_info->upstream_last_seen = atoi(PQgetvalue(res, 0, 8));
|
||||
}
|
||||
|
||||
termPQExpBuffer(&query);
|
||||
|
||||
Reference in New Issue
Block a user