From dd8204e01354ce75a6fa49eefc804fe5d24e8e56 Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Tue, 23 Feb 2021 10:14:16 +0900 Subject: [PATCH] Rename various shared library functions Some of the more generically named functions are at risk of colliding with functions defined in other libraries. To mitigate that risk, prefix with "repmgr_", unless the name already has some reference to repmgr. This requires an extension version bump. RM20471. --- Makefile.in | 4 +- repmgr--5.2--5.3.sql | 64 +++++++++++++++ repmgr--5.3.sql | 192 +++++++++++++++++++++++++++++++++++++++++++ repmgr.c | 72 ++++++++-------- repmgr.control | 3 +- repmgr_version.h.in | 4 +- 6 files changed, 298 insertions(+), 41 deletions(-) create mode 100644 repmgr--5.2--5.3.sql create mode 100644 repmgr--5.3.sql diff --git a/Makefile.in b/Makefile.in index 69055f6a..3925f102 100644 --- a/Makefile.in +++ b/Makefile.in @@ -27,7 +27,9 @@ DATA = \ repmgr--5.0--5.1.sql \ repmgr--5.1.sql \ repmgr--5.1--5.2.sql \ - repmgr--5.2.sql + repmgr--5.2.sql \ + repmgr--5.2--5.3.sql \ + repmgr--5.3.sql REGRESS = repmgr_extension diff --git a/repmgr--5.2--5.3.sql b/repmgr--5.2--5.3.sql new file mode 100644 index 00000000..19f3a516 --- /dev/null +++ b/repmgr--5.2--5.3.sql @@ -0,0 +1,64 @@ +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION repmgr" to load this file. \quit + +CREATE OR REPLACE FUNCTION set_local_node_id(INT) + RETURNS VOID + AS 'MODULE_PATHNAME', 'repmgr_set_local_node_id' + LANGUAGE C STRICT; + +CREATE OR REPLACE FUNCTION repmgr.get_local_node_id() + RETURNS INT + AS 'MODULE_PATHNAME', 'repmgr_get_local_node_id' + LANGUAGE C STRICT; + +CREATE OR REPLACE FUNCTION standby_set_last_updated() + RETURNS TIMESTAMP WITH TIME ZONE + AS 'MODULE_PATHNAME', 'repmgr_standby_set_last_updated' + LANGUAGE C STRICT; + +CREATE OR REPLACE FUNCTION standby_get_last_updated() + RETURNS TIMESTAMP WITH TIME ZONE + AS 'MODULE_PATHNAME', 'repmgr_standby_get_last_updated' + LANGUAGE C STRICT; + +CREATE OR REPLACE FUNCTION set_upstream_last_seen(INT) + RETURNS VOID + AS 'MODULE_PATHNAME', 'repmgr_set_upstream_last_seen' + LANGUAGE C STRICT; + +CREATE OR REPLACE FUNCTION get_upstream_last_seen() + RETURNS INT + AS 'MODULE_PATHNAME', 'repmgr_get_upstream_last_seen' + LANGUAGE C STRICT; + +CREATE OR REPLACE FUNCTION get_upstream_node_id() + RETURNS INT + AS 'MODULE_PATHNAME', 'repmgr_get_upstream_node_id' + LANGUAGE C STRICT; + +CREATE OR REPLACE FUNCTION set_upstream_node_id(INT) + RETURNS VOID + AS 'MODULE_PATHNAME', 'repmgr_set_upstream_node_id' + LANGUAGE C STRICT; + +/* failover functions */ + +CREATE OR REPLACE FUNCTION notify_follow_primary(INT) + RETURNS VOID + AS 'MODULE_PATHNAME', 'repmgr_notify_follow_primary' + LANGUAGE C STRICT; + +CREATE OR REPLACE FUNCTION get_new_primary() + RETURNS INT + AS 'MODULE_PATHNAME', 'repmgr_get_new_primary' + LANGUAGE C STRICT; + +CREATE OR REPLACE FUNCTION reset_voting_status() + RETURNS VOID + AS 'MODULE_PATHNAME', 'repmgr_reset_voting_status' + LANGUAGE C STRICT; + +CREATE OR REPLACE FUNCTION get_wal_receiver_pid() + RETURNS INT + AS 'MODULE_PATHNAME', 'repmgr_get_wal_receiver_pid' + LANGUAGE C STRICT; diff --git a/repmgr--5.3.sql b/repmgr--5.3.sql new file mode 100644 index 00000000..be029565 --- /dev/null +++ b/repmgr--5.3.sql @@ -0,0 +1,192 @@ +-- 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 + ); + diff --git a/repmgr.c b/repmgr.c index 12ad8119..76b672e2 100644 --- a/repmgr.c +++ b/repmgr.c @@ -88,38 +88,38 @@ void _PG_fini(void); static void repmgr_shmem_startup(void); -Datum set_local_node_id(PG_FUNCTION_ARGS); -PG_FUNCTION_INFO_V1(set_local_node_id); +Datum repmgr_set_local_node_id(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(repmgr_set_local_node_id); -Datum get_local_node_id(PG_FUNCTION_ARGS); -PG_FUNCTION_INFO_V1(get_local_node_id); +Datum repmgr_get_local_node_id(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(repmgr_get_local_node_id); -Datum standby_set_last_updated(PG_FUNCTION_ARGS); -PG_FUNCTION_INFO_V1(standby_set_last_updated); +Datum repmgr_standby_set_last_updated(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(repmgr_standby_set_last_updated); -Datum standby_get_last_updated(PG_FUNCTION_ARGS); -PG_FUNCTION_INFO_V1(standby_get_last_updated); +Datum repmgr_standby_get_last_updated(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(repmgr_standby_get_last_updated); -Datum set_upstream_last_seen(PG_FUNCTION_ARGS); -PG_FUNCTION_INFO_V1(set_upstream_last_seen); +Datum repmgr_set_upstream_last_seen(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(repmgr_set_upstream_last_seen); -Datum get_upstream_last_seen(PG_FUNCTION_ARGS); -PG_FUNCTION_INFO_V1(get_upstream_last_seen); +Datum repmgr_get_upstream_last_seen(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(repmgr_get_upstream_last_seen); -Datum get_upstream_node_id(PG_FUNCTION_ARGS); -PG_FUNCTION_INFO_V1(get_upstream_node_id); +Datum repmgr_get_upstream_node_id(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(repmgr_get_upstream_node_id); -Datum set_upstream_node_id(PG_FUNCTION_ARGS); -PG_FUNCTION_INFO_V1(set_upstream_node_id); +Datum repmgr_set_upstream_node_id(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(repmgr_set_upstream_node_id); -Datum notify_follow_primary(PG_FUNCTION_ARGS); -PG_FUNCTION_INFO_V1(notify_follow_primary); +Datum repmgr_notify_follow_primary(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(repmgr_notify_follow_primary); -Datum get_new_primary(PG_FUNCTION_ARGS); -PG_FUNCTION_INFO_V1(get_new_primary); +Datum repmgr_get_new_primary(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(repmgr_get_new_primary); -Datum reset_voting_status(PG_FUNCTION_ARGS); -PG_FUNCTION_INFO_V1(reset_voting_status); +Datum repmgr_reset_voting_status(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(repmgr_reset_voting_status); Datum set_repmgrd_pid(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(set_repmgrd_pid); @@ -139,8 +139,8 @@ PG_FUNCTION_INFO_V1(repmgrd_pause); Datum repmgrd_is_paused(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(repmgrd_is_paused); -Datum get_wal_receiver_pid(PG_FUNCTION_ARGS); -PG_FUNCTION_INFO_V1(get_wal_receiver_pid); +Datum repmgr_get_wal_receiver_pid(PG_FUNCTION_ARGS); +PG_FUNCTION_INFO_V1(repmgr_get_wal_receiver_pid); /* @@ -233,7 +233,7 @@ repmgr_shmem_startup(void) /* ==================== */ Datum -set_local_node_id(PG_FUNCTION_ARGS) +repmgr_set_local_node_id(PG_FUNCTION_ARGS) { int local_node_id = UNKNOWN_NODE_ID; int stored_node_id = UNKNOWN_NODE_ID; @@ -303,7 +303,7 @@ set_local_node_id(PG_FUNCTION_ARGS) Datum -get_local_node_id(PG_FUNCTION_ARGS) +repmgr_get_local_node_id(PG_FUNCTION_ARGS) { int local_node_id = UNKNOWN_NODE_ID; @@ -320,7 +320,7 @@ get_local_node_id(PG_FUNCTION_ARGS) /* update and return last updated with current timestamp */ Datum -standby_set_last_updated(PG_FUNCTION_ARGS) +repmgr_standby_set_last_updated(PG_FUNCTION_ARGS) { TimestampTz last_updated = GetCurrentTimestamp(); @@ -337,7 +337,7 @@ standby_set_last_updated(PG_FUNCTION_ARGS) /* get last updated timestamp */ Datum -standby_get_last_updated(PG_FUNCTION_ARGS) +repmgr_standby_get_last_updated(PG_FUNCTION_ARGS) { TimestampTz last_updated; @@ -354,7 +354,7 @@ standby_get_last_updated(PG_FUNCTION_ARGS) Datum -set_upstream_last_seen(PG_FUNCTION_ARGS) +repmgr_set_upstream_last_seen(PG_FUNCTION_ARGS) { int upstream_node_id = UNKNOWN_NODE_ID; @@ -377,7 +377,7 @@ set_upstream_last_seen(PG_FUNCTION_ARGS) Datum -get_upstream_last_seen(PG_FUNCTION_ARGS) +repmgr_get_upstream_last_seen(PG_FUNCTION_ARGS) { long secs; int microsecs; @@ -411,7 +411,7 @@ get_upstream_last_seen(PG_FUNCTION_ARGS) Datum -get_upstream_node_id(PG_FUNCTION_ARGS) +repmgr_get_upstream_node_id(PG_FUNCTION_ARGS) { int upstream_node_id = UNKNOWN_NODE_ID; @@ -426,7 +426,7 @@ get_upstream_node_id(PG_FUNCTION_ARGS) } Datum -set_upstream_node_id(PG_FUNCTION_ARGS) +repmgr_set_upstream_node_id(PG_FUNCTION_ARGS) { int upstream_node_id = UNKNOWN_NODE_ID; int local_node_id = UNKNOWN_NODE_ID; @@ -462,7 +462,7 @@ set_upstream_node_id(PG_FUNCTION_ARGS) Datum -notify_follow_primary(PG_FUNCTION_ARGS) +repmgr_notify_follow_primary(PG_FUNCTION_ARGS) { int primary_node_id = UNKNOWN_NODE_ID; @@ -505,7 +505,7 @@ notify_follow_primary(PG_FUNCTION_ARGS) Datum -get_new_primary(PG_FUNCTION_ARGS) +repmgr_get_new_primary(PG_FUNCTION_ARGS) { int new_primary_node_id = UNKNOWN_NODE_ID; @@ -527,7 +527,7 @@ get_new_primary(PG_FUNCTION_ARGS) Datum -reset_voting_status(PG_FUNCTION_ARGS) +repmgr_reset_voting_status(PG_FUNCTION_ARGS) { if (!shared_state) PG_RETURN_NULL(); @@ -735,7 +735,7 @@ repmgrd_is_paused(PG_FUNCTION_ARGS) Datum -get_wal_receiver_pid(PG_FUNCTION_ARGS) +repmgr_get_wal_receiver_pid(PG_FUNCTION_ARGS) { int wal_receiver_pid; diff --git a/repmgr.control b/repmgr.control index 0781d95f..efa79eb1 100644 --- a/repmgr.control +++ b/repmgr.control @@ -1,8 +1,7 @@ # repmgr extension comment = 'Replication manager for PostgreSQL' -default_version = '5.2' +default_version = '5.3' module_pathname = '$libdir/repmgr' relocatable = false schema = repmgr - diff --git a/repmgr_version.h.in b/repmgr_version.h.in index 6fe4a0a8..45d26270 100644 --- a/repmgr_version.h.in +++ b/repmgr_version.h.in @@ -1,7 +1,7 @@ #define REPMGR_VERSION_DATE "" #define REPMGR_VERSION "5.3dev" #define REPMGR_VERSION_NUM 50300 -#define REPMGR_EXTENSION_VERSION "5.2" -#define REPMGR_EXTENSION_NUM 50200 +#define REPMGR_EXTENSION_VERSION "5.3" +#define REPMGR_EXTENSION_NUM 50300 #define REPMGR_RELEASE_DATE "2021-XX-XX" #define PG_ACTUAL_VERSION_NUM