mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-26 00:26:30 +00:00
repmgrd: only vote for self if no other node is ahead
This commit is contained in:
36
repmgrd.c
36
repmgrd.c
@@ -1103,6 +1103,7 @@ do_election(void)
|
|||||||
NodeInfoListCell *cell;
|
NodeInfoListCell *cell;
|
||||||
|
|
||||||
bool other_node_is_candidate = false;
|
bool other_node_is_candidate = false;
|
||||||
|
bool other_node_is_ahead = false;
|
||||||
|
|
||||||
/* sleep for a random period of 100 ~ 500 ms
|
/* sleep for a random period of 100 ~ 500 ms
|
||||||
* XXX adjust this downwards if feasible
|
* XXX adjust this downwards if feasible
|
||||||
@@ -1194,34 +1195,14 @@ do_election(void)
|
|||||||
|
|
||||||
// XXX check if > 50% visible
|
// XXX check if > 50% visible
|
||||||
|
|
||||||
/* check again if we've been asked to vote */
|
|
||||||
|
|
||||||
if (0)
|
|
||||||
{
|
|
||||||
voting_status = get_voting_status(local_conn);
|
|
||||||
log_debug("do_election(): node voting status is %i", (int)voting_status);
|
|
||||||
|
|
||||||
|
|
||||||
if (voting_status == VS_VOTE_REQUEST_RECEIVED)
|
|
||||||
{
|
|
||||||
/* we've already been requested to vote, so can't become a candidate */
|
|
||||||
return voting_status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* current node votes for itself by default */
|
|
||||||
// XXX check returned LSNs, if one is higher than ours, don't vote for ourselves
|
|
||||||
// either
|
|
||||||
|
|
||||||
votes_for_me += 1;
|
|
||||||
|
|
||||||
/* get our lsn */
|
/* get our lsn */
|
||||||
local_node_info.last_wal_receive_lsn = get_last_wal_receive_location(local_conn);
|
local_node_info.last_wal_receive_lsn = get_last_wal_receive_location(local_conn);
|
||||||
|
|
||||||
log_debug("LAST receive lsn = %X/%X",
|
log_debug("LAST receive lsn = %X/%X",
|
||||||
(uint32) (local_node_info.last_wal_receive_lsn >> 32),
|
(uint32) (local_node_info.last_wal_receive_lsn >> 32),
|
||||||
(uint32) local_node_info.last_wal_receive_lsn);
|
(uint32) local_node_info.last_wal_receive_lsn);
|
||||||
/* request vote */
|
|
||||||
|
/* request vote from each node */
|
||||||
|
|
||||||
for (cell = standby_nodes.head; cell; cell = cell->next)
|
for (cell = standby_nodes.head; cell; cell = cell->next)
|
||||||
{
|
{
|
||||||
@@ -1234,10 +1215,21 @@ do_election(void)
|
|||||||
cell->node_info,
|
cell->node_info,
|
||||||
electoral_term);
|
electoral_term);
|
||||||
|
|
||||||
|
if (cell->node_info->last_wal_receive_lsn > local_node_info.last_wal_receive_lsn)
|
||||||
|
{
|
||||||
|
/* register if another node is ahead of us */
|
||||||
|
other_node_is_ahead = true;
|
||||||
|
}
|
||||||
PQfinish(cell->node_info->conn);
|
PQfinish(cell->node_info->conn);
|
||||||
cell->node_info->conn = NULL;
|
cell->node_info->conn = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* vote for myself, but only if I believe no-one else is ahead */
|
||||||
|
if (other_node_is_ahead == false)
|
||||||
|
{
|
||||||
|
votes_for_me += 1;
|
||||||
|
}
|
||||||
|
|
||||||
log_notice(_("%i of of %i votes"), votes_for_me, visible_nodes);
|
log_notice(_("%i of of %i votes"), votes_for_me, visible_nodes);
|
||||||
|
|
||||||
if (votes_for_me == visible_nodes)
|
if (votes_for_me == visible_nodes)
|
||||||
|
|||||||
Reference in New Issue
Block a user