From 280654bed67448661cd5efe5dbd08b23e070cad3 Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Tue, 5 Mar 2019 11:20:33 +0900 Subject: [PATCH] repmgrd: don't wait for WAL receiver to reconnect during failover If the WAL receiver has been temporarily disabled, we don't want to wait for it to start up as it may not be able to at that point; we do however need to reset "wal_retrieve_retry_interval". --- repmgr-action-node.c | 11 ++++++++++- repmgrd-physical.c | 4 ++-- sysutils.c | 5 ++++- sysutils.h | 2 +- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/repmgr-action-node.c b/repmgr-action-node.c index 7f26d929..74c7e1e9 100644 --- a/repmgr-action-node.c +++ b/repmgr-action-node.c @@ -2707,9 +2707,18 @@ do_node_control(void) if (runtime_options.enable_wal_receiver == true) { - wal_receiver_pid = enable_wal_receiver(conn); + wal_receiver_pid = enable_wal_receiver(conn, true); + + PQfinish(conn); + + if (wal_receiver_pid == UNKNOWN_PID) + exit(ERR_BAD_CONFIG); + + exit(SUCCESS); } + log_error(_("no option provided")); + PQfinish(conn); } diff --git a/repmgrd-physical.c b/repmgrd-physical.c index 2d4fc6cc..e9721568 100644 --- a/repmgrd-physical.c +++ b/repmgrd-physical.c @@ -2078,8 +2078,8 @@ do_primary_failover(void) /* Reenable WAL receiver, if disabled and node is not the promotion candidate */ if (config_file_options.standby_disconnect_on_failover == true && election_result != ELECTION_WON) { - // XXX check return value - enable_wal_receiver(local_conn); + /* adjust "wal_retrieve_retry_interval" but don't wait for WAL receiver to start */ + enable_wal_receiver(local_conn, false); } if (election_result == ELECTION_CANCELLED) diff --git a/sysutils.c b/sysutils.c index a1473fe8..7aa5687c 100644 --- a/sysutils.c +++ b/sysutils.c @@ -276,7 +276,7 @@ disable_wal_receiver(PGconn *conn) } pid_t -enable_wal_receiver(PGconn *conn) +enable_wal_receiver(PGconn *conn, bool wait_startup) { char buf[MAXLEN]; int wal_retrieve_retry_interval; @@ -326,6 +326,9 @@ enable_wal_receiver(PGconn *conn) wal_retrieve_retry_interval); } + if (wait_startup == false) + return UNKNOWN_PID; + for (i = 0; i < timeout; i++) { wal_receiver_pid = (pid_t)get_wal_receiver_pid(conn); diff --git a/sysutils.h b/sysutils.h index 4ddc3d36..6c046920 100644 --- a/sysutils.h +++ b/sysutils.h @@ -26,7 +26,7 @@ extern bool local_command_simple(const char *command, PQExpBufferData *outputbuf extern bool remote_command(const char *host, const char *user, const char *command, const char *ssh_options, PQExpBufferData *outputbuf); extern pid_t disable_wal_receiver(PGconn *conn); -extern pid_t enable_wal_receiver(PGconn *conn); +extern pid_t enable_wal_receiver(PGconn *conn, bool wait_startup); #endif /* _SYSUTILS_H_ */