From e53f1bf844a7981021e87a1485a16d31ce855d75 Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Fri, 3 Mar 2017 11:10:08 +0900 Subject: [PATCH] repmgrd: support further renamed WAL function for PostgreSQL 10 --- repmgrd.c | 106 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 75 insertions(+), 31 deletions(-) diff --git a/repmgrd.c b/repmgrd.c index 526d9680..2f9b65a2 100644 --- a/repmgrd.c +++ b/repmgrd.c @@ -63,6 +63,7 @@ bool failover_done = false; bool manual_mode_upstream_disconnected = false; char *pid_file = NULL; +int server_version_num = 0; static void help(void); static void usage(void); @@ -137,8 +138,6 @@ main(int argc, char **argv) FILE *fd; - int server_version_num = 0; - set_progname(argv[0]); /* Disallow running as root to prevent directory ownership problems */ @@ -716,20 +715,40 @@ witness_monitor(void) /* * Build the SQL to execute on master */ - sqlquery_snprintf(sqlquery, - "INSERT INTO %s.repl_monitor " - " (primary_node, standby_node, " - " last_monitor_time, last_apply_time, " - " last_wal_primary_location, last_wal_standby_location, " - " replication_lag, apply_lag )" - " VALUES(%d, %d, " - " '%s'::TIMESTAMP WITH TIME ZONE, NULL, " - " pg_catalog.pg_current_xlog_location(), NULL, " - " 0, 0) ", - get_repmgr_schema_quoted(my_local_conn), - master_options.node, - local_options.node, - monitor_witness_timestamp); + if (server_version_num >= 100000) + { + sqlquery_snprintf(sqlquery, + "INSERT INTO %s.repl_monitor " + " (primary_node, standby_node, " + " last_monitor_time, last_apply_time, " + " last_wal_primary_location, last_wal_standby_location, " + " replication_lag, apply_lag )" + " VALUES(%d, %d, " + " '%s'::TIMESTAMP WITH TIME ZONE, NULL, " + " pg_catalog.pg_current_wal_location(), NULL, " + " 0, 0) ", + get_repmgr_schema_quoted(my_local_conn), + master_options.node, + local_options.node, + monitor_witness_timestamp); + } + else + { + sqlquery_snprintf(sqlquery, + "INSERT INTO %s.repl_monitor " + " (primary_node, standby_node, " + " last_monitor_time, last_apply_time, " + " last_wal_primary_location, last_wal_standby_location, " + " replication_lag, apply_lag )" + " VALUES(%d, %d, " + " '%s'::TIMESTAMP WITH TIME ZONE, NULL, " + " pg_catalog.pg_current_xlog_location(), NULL, " + " 0, 0) ", + get_repmgr_schema_quoted(my_local_conn), + master_options.node, + local_options.node, + monitor_witness_timestamp); + } /* * Execute the query asynchronously, but don't check for a result. We will @@ -1117,21 +1136,42 @@ standby_monitor(void) * If receive_location is less than replay location, we were streaming WAL but are * somehow disconnected and evidently in archive recovery */ - sqlquery_snprintf(sqlquery, - " SELECT ts, " - " CASE WHEN (receive_location IS NULL OR receive_location < replay_location) " - " THEN replay_location " - " ELSE receive_location" - " END AS receive_location," - " replay_location, " - " replay_timestamp, " - " COALESCE(receive_location, '0/0') >= replay_location AS receiving_streamed_wal " - " FROM (SELECT CURRENT_TIMESTAMP AS ts, " - " pg_catalog.pg_last_xlog_receive_location() AS receive_location, " - " pg_catalog.pg_last_xlog_replay_location() AS replay_location, " - " pg_catalog.pg_last_xact_replay_timestamp() AS replay_timestamp " - " ) q "); + if (server_version_num >= 100000) + { + sqlquery_snprintf(sqlquery, + " SELECT ts, " + " CASE WHEN (receive_location IS NULL OR receive_location < replay_location) " + " THEN replay_location " + " ELSE receive_location" + " END AS receive_location," + " replay_location, " + " replay_timestamp, " + " COALESCE(receive_location, '0/0') >= replay_location AS receiving_streamed_wal " + " FROM (SELECT CURRENT_TIMESTAMP AS ts, " + " pg_catalog.pg_last_wal_receive_location() AS receive_location, " + " pg_catalog.pg_last_wal_replay_location() AS replay_location, " + " pg_catalog.pg_last_xact_replay_timestamp() AS replay_timestamp " + " ) q "); + + } + else + { + sqlquery_snprintf(sqlquery, + " SELECT ts, " + " CASE WHEN (receive_location IS NULL OR receive_location < replay_location) " + " THEN replay_location " + " ELSE receive_location" + " END AS receive_location," + " replay_location, " + " replay_timestamp, " + " COALESCE(receive_location, '0/0') >= replay_location AS receiving_streamed_wal " + " FROM (SELECT CURRENT_TIMESTAMP AS ts, " + " pg_catalog.pg_last_xlog_receive_location() AS receive_location, " + " pg_catalog.pg_last_xlog_replay_location() AS replay_location, " + " pg_catalog.pg_last_xact_replay_timestamp() AS replay_timestamp " + " ) q "); + } res = PQexec(my_local_conn, sqlquery); @@ -1165,7 +1205,11 @@ standby_monitor(void) * TODO: investigate whether pg_current_xlog_insert_location() would be a better * choice; see: https://github.com/2ndQuadrant/repmgr/issues/189 */ - sqlquery_snprintf(sqlquery, "SELECT pg_catalog.pg_current_xlog_location()"); + + if (server_version_num >= 100000) + sqlquery_snprintf(sqlquery, "SELECT pg_catalog.pg_current_wal_location()"); + else + sqlquery_snprintf(sqlquery, "SELECT pg_catalog.pg_current_xlog_location()"); res = PQexec(master_conn, sqlquery); if (PQresultStatus(res) != PGRES_TUPLES_OK)