From 0caec90d8147236e428cf7c787c0c66bab6b09c1 Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Fri, 16 Nov 2018 17:53:55 +0900 Subject: [PATCH] repmgrd: set primary last seen --- dbutils.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++ dbutils.h | 2 ++ repmgrd-physical.c | 7 ++++-- 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/dbutils.c b/dbutils.c index 70f4a036..161f421b 100644 --- a/dbutils.c +++ b/dbutils.c @@ -3168,6 +3168,59 @@ is_downstream_node_attached(PGconn *conn, char *node_name) return true; } +void +set_primary_last_seen(PGconn *conn) +{ + PQExpBufferData query; + PGresult *res = NULL; + + initPQExpBuffer(&query); + + appendPQExpBufferStr(&query, + "SELECT repmgr.set_primary_last_seen()"); + + res = PQexec(conn, query.data); + + if (PQresultStatus(res) != PGRES_COMMAND_OK) + { + log_db_error(conn, query.data, _("unable to execute repmgr.set_primary_last_seen()")); + } + + termPQExpBuffer(&query); + PQclear(res); + +} + +int +get_primary_last_seen(PGconn *conn) +{ + PQExpBufferData query; + PGresult *res = NULL; + int primary_last_seen = -1; + + initPQExpBuffer(&query); + + appendPQExpBufferStr(&query, + "SELECT repmgr.get_primary_last_seen()"); + + res = PQexec(conn, query.data); + + if (PQresultStatus(res) != PGRES_COMMAND_OK) + { + log_db_error(conn, query.data, _("unable to execute repmgr.get_primary_last_seen()")); + } + else + { + primary_last_seen = atoi(PQgetvalue(res, 0, 0)); + } + + termPQExpBuffer(&query); + PQclear(res); + + return primary_last_seen; +} + + void clear_node_info_list(NodeInfoList *nodes) { diff --git a/dbutils.h b/dbutils.h index a5b50d7a..16453b04 100644 --- a/dbutils.h +++ b/dbutils.h @@ -545,6 +545,8 @@ bool get_replication_info(PGconn *conn, ReplInfo *replication_info); int get_replication_lag_seconds(PGconn *conn); void get_node_replication_stats(PGconn *conn, int server_version_num, t_node_info *node_info); bool is_downstream_node_attached(PGconn *conn, char *node_name); +void set_primary_last_seen(PGconn *conn); +int get_primary_last_seen(PGconn *conn); /* BDR functions */ int get_bdr_version_num(void); diff --git a/repmgrd-physical.c b/repmgrd-physical.c index efb065a2..a35ccd2e 100644 --- a/repmgrd-physical.c +++ b/repmgrd-physical.c @@ -805,7 +805,11 @@ monitor_streaming_standby(void) while (true) { log_verbose(LOG_DEBUG, "checking %s", upstream_node_info.conninfo); - if (is_server_available(upstream_node_info.conninfo) == false) + if (is_server_available(upstream_node_info.conninfo) == true) + { + set_primary_last_seen(local_conn); + } + else { /* upstream node is down, we were expecting it to be up */ if (upstream_node_info.node_status == NODE_STATUS_UP) @@ -1266,7 +1270,6 @@ loop: check_connection(&local_node_info, &local_conn); - if (PQstatus(local_conn) != CONNECTION_OK) { if (local_node_info.active == true)