repmgrd: support further renamed WAL function for PostgreSQL 10

This commit is contained in:
Ian Barwick
2017-03-03 11:10:08 +09:00
committed by Ian Barwick
parent 90638811c8
commit e53f1bf844

106
repmgrd.c
View File

@@ -63,6 +63,7 @@ bool failover_done = false;
bool manual_mode_upstream_disconnected = false; bool manual_mode_upstream_disconnected = false;
char *pid_file = NULL; char *pid_file = NULL;
int server_version_num = 0;
static void help(void); static void help(void);
static void usage(void); static void usage(void);
@@ -137,8 +138,6 @@ main(int argc, char **argv)
FILE *fd; FILE *fd;
int server_version_num = 0;
set_progname(argv[0]); set_progname(argv[0]);
/* Disallow running as root to prevent directory ownership problems */ /* Disallow running as root to prevent directory ownership problems */
@@ -716,20 +715,40 @@ witness_monitor(void)
/* /*
* Build the SQL to execute on master * Build the SQL to execute on master
*/ */
sqlquery_snprintf(sqlquery, if (server_version_num >= 100000)
"INSERT INTO %s.repl_monitor " {
" (primary_node, standby_node, " sqlquery_snprintf(sqlquery,
" last_monitor_time, last_apply_time, " "INSERT INTO %s.repl_monitor "
" last_wal_primary_location, last_wal_standby_location, " " (primary_node, standby_node, "
" replication_lag, apply_lag )" " last_monitor_time, last_apply_time, "
" VALUES(%d, %d, " " last_wal_primary_location, last_wal_standby_location, "
" '%s'::TIMESTAMP WITH TIME ZONE, NULL, " " replication_lag, apply_lag )"
" pg_catalog.pg_current_xlog_location(), NULL, " " VALUES(%d, %d, "
" 0, 0) ", " '%s'::TIMESTAMP WITH TIME ZONE, NULL, "
get_repmgr_schema_quoted(my_local_conn), " pg_catalog.pg_current_wal_location(), NULL, "
master_options.node, " 0, 0) ",
local_options.node, get_repmgr_schema_quoted(my_local_conn),
monitor_witness_timestamp); 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 * 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 * If receive_location is less than replay location, we were streaming WAL but are
* somehow disconnected and evidently in archive recovery * 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); 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 * TODO: investigate whether pg_current_xlog_insert_location() would be a better
* choice; see: https://github.com/2ndQuadrant/repmgr/issues/189 * 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); res = PQexec(master_conn, sqlquery);
if (PQresultStatus(res) != PGRES_TUPLES_OK) if (PQresultStatus(res) != PGRES_TUPLES_OK)