From 02daccd6e7cec96df59a6f43276323b5255997fb Mon Sep 17 00:00:00 2001 From: Greg Smith Date: Wed, 23 Feb 2011 06:44:10 -0500 Subject: [PATCH] Wrap use of PQconnectdbParams, add proper error checking and logging when the connection fails. --- dbutils.c | 20 ++++++++++++++++++++ dbutils.h | 3 +++ repmgr.c | 26 ++++++++++---------------- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/dbutils.c b/dbutils.c index 37b938d1..da712a73 100644 --- a/dbutils.c +++ b/dbutils.c @@ -43,6 +43,26 @@ establishDBConnection(const char *conninfo, const bool exit_on_error) return conn; } +PGconn * +establishDBConnectionByParams(const char *keywords[], const char *values[],const bool exit_on_error) +{ + /* Make a connection to the database */ + PGconn *conn = PQconnectdbParams(keywords, values, true); + + /* Check to see that the backend connection was successfully made */ + if ((PQstatus(conn) != CONNECTION_OK)) + { + log_err(_("Connection to database failed: %s\n"), + PQerrorMessage(conn)); + if (exit_on_error) + { + PQfinish(conn); + exit(ERR_DB_CON); + } + } + + return conn; +} bool is_standby(PGconn *conn) diff --git a/dbutils.h b/dbutils.h index 45d0ea96..7eb68ed6 100644 --- a/dbutils.h +++ b/dbutils.h @@ -21,6 +21,9 @@ #define _REPMGR_DBUTILS_H_ PGconn *establishDBConnection(const char *conninfo, const bool exit_on_error); +PGconn *establishDBConnectionByParams(const char *keywords[], + const char *values[], + const bool exit_on_error); bool is_standby(PGconn *conn); char *pg_version(PGconn *conn, char* major_version); bool guc_setted(PGconn *conn, const char *parameter, const char *op, diff --git a/repmgr.c b/repmgr.c index e058bad4..baae4b26 100644 --- a/repmgr.c +++ b/repmgr.c @@ -732,13 +732,7 @@ do_standby_clone(void) /* We need to connect to check configuration and start a backup */ log_info(_("%s connecting to master database\n"), progname); - conn = PQconnectdbParams(keywords, values, true); - if (!conn) - { - log_err(_("%s: could not connect to master\n"), - progname); - exit(ERR_BAD_CONFIG); - } + conn=establishDBConnectionByParams(keywords,values,true); /* primary should be v9 or better */ log_info(_("%s connected to master, checking its state\n"), progname); @@ -1011,17 +1005,17 @@ do_standby_clone(void) } stop_backup: - /* inform the master that we have finished the backup */ - conn = PQconnectdbParams(keywords, values, true); - if (!conn) - { - log_err(_("%s: could not connect to master\n"), - progname); - exit(ERR_BAD_RSYNC); - } + + /* + * Inform the master that we have finished the backup. + * + * Don't have this one exit if it fails, so that a more informative + * error message will also appear about the backup not being stopped. + */ + log_info(_("%s connecting to master database to stop backup\n"), progname); + conn=establishDBConnectionByParams(keywords,values,false); log_notice("Finishing backup...\n"); - sqlquery_snprintf(sqlquery, "SELECT pg_xlogfile_name(pg_stop_backup())"); log_debug("standby clone: %s\n", sqlquery);