mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-26 16:46:28 +00:00
repmgrd: support further renamed WAL function for PostgreSQL 10
This commit is contained in:
106
repmgrd.c
106
repmgrd.c
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user