diff --git a/dbutils.c b/dbutils.c index 27a1852b..c8781587 100644 --- a/dbutils.c +++ b/dbutils.c @@ -94,11 +94,11 @@ is_standby(PGconn *conn) -bool +int is_witness(PGconn *conn, char *schema, char *cluster, int node_id) { PGresult *res; - bool result = false; + int result = 0; char sqlquery[QUERY_STR_LEN]; sqlquery_snprintf(sqlquery, "SELECT witness from %s.repl_nodes where cluster = '%s' and id = %d", @@ -107,13 +107,10 @@ is_witness(PGconn *conn, char *schema, char *cluster, int node_id) if (PQresultStatus(res) != PGRES_TUPLES_OK) { log_err(_("Can't query server mode: %s"), PQerrorMessage(conn)); - PQclear(res); - PQfinish(conn); - exit(ERR_DB_QUERY); + result = -1; } - - if (PQntuples(res) == 1 && strcmp(PQgetvalue(res, 0, 0), "t") == 0) - result = true; + else if (PQntuples(res) == 1 && strcmp(PQgetvalue(res, 0, 0), "t") == 0) + result = 1; PQclear(res); return result; diff --git a/dbutils.h b/dbutils.h index 1f2b7799..6bc771f7 100644 --- a/dbutils.h +++ b/dbutils.h @@ -27,7 +27,7 @@ PGconn *establishDBConnectionByParams(const char *keywords[], const char *values[], const bool exit_on_error); int is_standby(PGconn *conn); -bool is_witness(PGconn *conn, char *schema, char *cluster, int node_id); +int is_witness(PGconn *conn, char *schema, char *cluster, int node_id); bool is_pgup(PGconn *conn, int timeout); char *pg_version(PGconn *conn, char* major_version); bool guc_setted(PGconn *conn, const char *parameter, const char *op, diff --git a/repmgrd.c b/repmgrd.c index 8f547889..e79083b4 100644 --- a/repmgrd.c +++ b/repmgrd.c @@ -301,23 +301,31 @@ main(int argc, char **argv) */ do { - ret = is_standby(myLocalConn); - /* * Set my server mode, establish a connection to primary * and start monitor */ - if (is_witness(myLocalConn, repmgr_schema, local_options.cluster_name, local_options.node)) + ret = is_witness(myLocalConn, repmgr_schema, local_options.cluster_name, local_options.node); + + if (ret == 1) myLocalMode = WITNESS_MODE; - else if (ret == 1) - myLocalMode = STANDBY_MODE; + else if (ret == 0) + { + ret = is_standby(myLocalConn); + + if (ret == 1) + myLocalMode = STANDBY_MODE; + else if (ret == 0) /* is the master */ + myLocalMode = PRIMARY_MODE; + } + /* XXX we did this before changing is_standby() to return int; we * should not exit at this point, but for now we do until we have a * better strategy */ - else if (ret == -1) + if (ret == -1) + { exit(1); - else /* is the master */ - myLocalMode = PRIMARY_MODE; + } switch (myLocalMode) {