repmgrd: fixes to failover handling

get_new_primary() returns NULL if no notification for the new primary has
been received, but the code was expecting it to return UNKNOWN_NODE_ID,
which was causing repmgrd to prematurely drop out of the new primary
detection loop if no notification had been received by the time the loop
started.

Also store the electoral term as a single row, single column table,
to ensure that all repmgrds see the same turn. It is then bumped
by the winning node after it gets promoted.

Various logging improvements.
This commit is contained in:
Ian Barwick
2017-11-08 14:19:52 +09:00
parent 7232187f4d
commit 79d21b516b
5 changed files with 134 additions and 29 deletions

View File

@@ -79,6 +79,22 @@ LEFT JOIN repmgr.nodes un
ON un.node_id = n.upstream_node_id;
/* XXX update upgrade scripts! */
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;
/* XXX do this in "repmgr primary register" */
INSERT INTO repmgr.voting_term (term) VALUES (1);
/* ================= */
/* repmgrd functions */
/* ================= */
@@ -135,8 +151,8 @@ CREATE FUNCTION get_voting_status()
AS 'MODULE_PATHNAME', 'get_voting_status'
LANGUAGE C STRICT;
CREATE FUNCTION set_voting_status_initiated()
RETURNS INT
CREATE FUNCTION set_voting_status_initiated(INT)
RETURNS VOID
AS 'MODULE_PATHNAME', 'set_voting_status_initiated'
LANGUAGE C STRICT;