mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-25 08:06:29 +00:00
Count witness and zero-priority nodes in visibility check
This commit is contained in:
20
dbutils.c
20
dbutils.c
@@ -4898,7 +4898,7 @@ init_replication_info(ReplInfo *replication_info)
|
|||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
get_replication_info(PGconn *conn, ReplInfo *replication_info)
|
get_replication_info(PGconn *conn, t_server_type node_type, ReplInfo *replication_info)
|
||||||
{
|
{
|
||||||
PQExpBufferData query;
|
PQExpBufferData query;
|
||||||
PGresult *res = NULL;
|
PGresult *res = NULL;
|
||||||
@@ -4960,11 +4960,21 @@ get_replication_info(PGconn *conn, ReplInfo *replication_info)
|
|||||||
" END AS wal_replay_paused, ");
|
" END AS wal_replay_paused, ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (node_type == WITNESS)
|
||||||
|
{
|
||||||
|
appendPQExpBufferStr(&query,
|
||||||
|
" repmgr.get_upstream_last_seen() AS upstream_last_seen");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
appendPQExpBufferStr(&query,
|
||||||
|
" CASE WHEN pg_catalog.pg_is_in_recovery() IS FALSE "
|
||||||
|
" THEN -1 "
|
||||||
|
" ELSE repmgr.get_upstream_last_seen() "
|
||||||
|
" END AS upstream_last_seen ");
|
||||||
|
}
|
||||||
|
|
||||||
appendPQExpBufferStr(&query,
|
appendPQExpBufferStr(&query,
|
||||||
" CASE WHEN pg_catalog.pg_is_in_recovery() IS FALSE "
|
|
||||||
" THEN -1 "
|
|
||||||
" ELSE repmgr.get_upstream_last_seen() "
|
|
||||||
" END AS upstream_last_seen "
|
|
||||||
" ) q ");
|
" ) q ");
|
||||||
|
|
||||||
log_verbose(LOG_DEBUG, "get_replication_info():\n%s", query.data);
|
log_verbose(LOG_DEBUG, "get_replication_info():\n%s", query.data);
|
||||||
|
|||||||
@@ -554,7 +554,7 @@ XLogRecPtr get_primary_current_lsn(PGconn *conn);
|
|||||||
XLogRecPtr get_node_current_lsn(PGconn *conn);
|
XLogRecPtr get_node_current_lsn(PGconn *conn);
|
||||||
XLogRecPtr get_last_wal_receive_location(PGconn *conn);
|
XLogRecPtr get_last_wal_receive_location(PGconn *conn);
|
||||||
void init_replication_info(ReplInfo *replication_info);
|
void init_replication_info(ReplInfo *replication_info);
|
||||||
bool get_replication_info(PGconn *conn, ReplInfo *replication_info);
|
bool get_replication_info(PGconn *conn, t_server_type node_type, ReplInfo *replication_info);
|
||||||
int get_replication_lag_seconds(PGconn *conn);
|
int get_replication_lag_seconds(PGconn *conn);
|
||||||
void get_node_replication_stats(PGconn *conn, t_node_info *node_info);
|
void get_node_replication_stats(PGconn *conn, t_node_info *node_info);
|
||||||
bool is_downstream_node_attached(PGconn *conn, char *node_name);
|
bool is_downstream_node_attached(PGconn *conn, char *node_name);
|
||||||
|
|||||||
@@ -413,7 +413,7 @@ do_node_status(void)
|
|||||||
node_info.upstream_node_name,
|
node_info.upstream_node_name,
|
||||||
node_info.upstream_node_id);
|
node_info.upstream_node_id);
|
||||||
|
|
||||||
get_replication_info(conn, &replication_info);
|
get_replication_info(conn, node_info.type, &replication_info);
|
||||||
|
|
||||||
key_value_list_set_format(&node_status,
|
key_value_list_set_format(&node_status,
|
||||||
"Replication lag",
|
"Replication lag",
|
||||||
|
|||||||
@@ -2009,7 +2009,7 @@ do_standby_promote(void)
|
|||||||
|
|
||||||
init_replication_info(&replication_info);
|
init_replication_info(&replication_info);
|
||||||
|
|
||||||
if (get_replication_info(conn, &replication_info) == false)
|
if (get_replication_info(conn, STANDBY, &replication_info) == false)
|
||||||
{
|
{
|
||||||
log_error(_("unable to retrieve replication information from local node"));
|
log_error(_("unable to retrieve replication information from local node"));
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
@@ -3262,7 +3262,7 @@ do_standby_switchover(void)
|
|||||||
ReplInfo replication_info;
|
ReplInfo replication_info;
|
||||||
init_replication_info(&replication_info);
|
init_replication_info(&replication_info);
|
||||||
|
|
||||||
if (get_replication_info(local_conn, &replication_info) == false)
|
if (get_replication_info(local_conn, STANDBY, &replication_info) == false)
|
||||||
{
|
{
|
||||||
log_error(_("unable to retrieve replication information from local node"));
|
log_error(_("unable to retrieve replication information from local node"));
|
||||||
PQfinish(local_conn);
|
PQfinish(local_conn);
|
||||||
@@ -4326,7 +4326,7 @@ do_standby_switchover(void)
|
|||||||
|
|
||||||
for (i = 0; i < config_file_options.wal_receive_check_timeout; i++)
|
for (i = 0; i < config_file_options.wal_receive_check_timeout; i++)
|
||||||
{
|
{
|
||||||
get_replication_info(local_conn, &replication_info);
|
get_replication_info(local_conn, STANDBY, &replication_info);
|
||||||
if (replication_info.last_wal_receive_lsn >= remote_last_checkpoint_lsn)
|
if (replication_info.last_wal_receive_lsn >= remote_last_checkpoint_lsn)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -2381,7 +2381,7 @@ update_monitoring_history(void)
|
|||||||
|
|
||||||
init_replication_info(&replication_info);
|
init_replication_info(&replication_info);
|
||||||
|
|
||||||
if (get_replication_info(local_conn, &replication_info) == false)
|
if (get_replication_info(local_conn, STANDBY, &replication_info) == false)
|
||||||
{
|
{
|
||||||
log_warning(_("unable to retrieve replication status information, unable to update monitoring history"));
|
log_warning(_("unable to retrieve replication status information, unable to update monitoring history"));
|
||||||
return;
|
return;
|
||||||
@@ -3376,7 +3376,7 @@ do_election(NodeInfoList *sibling_nodes)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* get our lsn */
|
/* get our lsn */
|
||||||
if (get_replication_info(local_conn, &local_replication_info) == false)
|
if (get_replication_info(local_conn, STANDBY, &local_replication_info) == false)
|
||||||
{
|
{
|
||||||
log_error(_("unable to retrieve replication information for local node"));
|
log_error(_("unable to retrieve replication information for local node"));
|
||||||
return ELECTION_LOST;
|
return ELECTION_LOST;
|
||||||
@@ -3444,24 +3444,6 @@ do_election(NodeInfoList *sibling_nodes)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* don't interrogate a witness server */
|
|
||||||
if (cell->node_info->type == WITNESS)
|
|
||||||
{
|
|
||||||
log_debug("node %i is witness, not querying state", cell->node_info->node_id);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* don't check 0-priority nodes */
|
|
||||||
if (cell->node_info->priority <= 0)
|
|
||||||
{
|
|
||||||
log_info(_("node %i has priority of %i, skipping"),
|
|
||||||
cell->node_info->node_id,
|
|
||||||
cell->node_info->priority);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* check if repmgrd running - skip if not
|
* check if repmgrd running - skip if not
|
||||||
*
|
*
|
||||||
@@ -3478,7 +3460,7 @@ do_election(NodeInfoList *sibling_nodes)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (get_replication_info(cell->node_info->conn, &sibling_replication_info) == false)
|
if (get_replication_info(cell->node_info->conn, cell->node_info->type, &sibling_replication_info) == false)
|
||||||
{
|
{
|
||||||
log_warning(_("unable to retrieve replication information for node \"%s\" (ID: %i), skipping"),
|
log_warning(_("unable to retrieve replication information for node \"%s\" (ID: %i), skipping"),
|
||||||
cell->node_info->node_name,
|
cell->node_info->node_name,
|
||||||
@@ -3527,6 +3509,24 @@ do_election(NodeInfoList *sibling_nodes)
|
|||||||
sibling_replication_info.upstream_last_seen);
|
sibling_replication_info.upstream_last_seen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* don't interrogate a witness server */
|
||||||
|
if (cell->node_info->type == WITNESS)
|
||||||
|
{
|
||||||
|
log_debug("node %i is witness, not querying state", cell->node_info->node_id);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* don't check 0-priority nodes */
|
||||||
|
if (cell->node_info->priority <= 0)
|
||||||
|
{
|
||||||
|
log_info(_("node %i has priority of %i, skipping"),
|
||||||
|
cell->node_info->node_id,
|
||||||
|
cell->node_info->priority);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* get node's last receive LSN - if "higher" than current winner, current node is candidate */
|
/* get node's last receive LSN - if "higher" than current winner, current node is candidate */
|
||||||
cell->node_info->last_wal_receive_lsn = sibling_replication_info.last_wal_receive_lsn;
|
cell->node_info->last_wal_receive_lsn = sibling_replication_info.last_wal_receive_lsn;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user