From 7a76f1998ccb3543d6ad3220df19f1dbe56a2b04 Mon Sep 17 00:00:00 2001 From: Jaime Casanova Date: Tue, 12 Jun 2012 23:28:24 -0500 Subject: [PATCH] getMasterConnection() cannot avoid checking the same node that asks to find the master. This was a micro optimization based on the fact that all commands that needed to detect the master were executed from the standby but now that we have CLUSTER level commands that is not true anymore --- dbutils.c | 6 +++--- dbutils.h | 2 +- repmgr.c | 8 ++++---- repmgrd.c | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/dbutils.c b/dbutils.c index 7ccca6fb..ce3e1401 100644 --- a/dbutils.c +++ b/dbutils.c @@ -285,7 +285,7 @@ get_cluster_size(PGconn *conn) * connection string is placed there. */ PGconn * -getMasterConnection(PGconn *standby_conn, char *schema, int id, char *cluster, +getMasterConnection(PGconn *standby_conn, char *schema, char *cluster, int *master_id, char *master_conninfo_out) { PGconn *master_conn = NULL; @@ -323,8 +323,8 @@ getMasterConnection(PGconn *standby_conn, char *schema, int id, char *cluster, cluster); sqlquery_snprintf(sqlquery, "SELECT id, conninfo FROM %s.repl_nodes " - " WHERE cluster = '%s' and id <> %d and not witness", - schema_quoted, cluster, id); + " WHERE cluster = '%s' and not witness", + schema_quoted, cluster); res1 = PQexec(standby_conn, sqlquery); if (PQresultStatus(res1) != PGRES_TUPLES_OK) diff --git a/dbutils.h b/dbutils.h index 5ed35dec..fe3c0237 100644 --- a/dbutils.h +++ b/dbutils.h @@ -33,7 +33,7 @@ char *pg_version(PGconn *conn, char* major_version); bool guc_setted(PGconn *conn, const char *parameter, const char *op, const char *value); const char *get_cluster_size(PGconn *conn); -PGconn *getMasterConnection(PGconn *standby_conn, char *schema, int id, char *cluster, +PGconn *getMasterConnection(PGconn *standby_conn, char *schema, char *cluster, int *master_id, char *master_conninfo_out); int wait_connection_availability(PGconn *conn, int timeout); diff --git a/repmgr.c b/repmgr.c index 9d3edb6a..a65d3559 100644 --- a/repmgr.c +++ b/repmgr.c @@ -491,7 +491,7 @@ do_master_register(void) int id; /* Ensure there isn't any other master already registered */ - master_conn = getMasterConnection(conn, repmgr_schema, options.node, + master_conn = getMasterConnection(conn, repmgr_schema, options.cluster_name, &id,NULL); if (master_conn != NULL) { @@ -612,7 +612,7 @@ do_standby_register(void) /* check if there is a master in this cluster */ log_info(_("%s connecting to master database\n"), progname); - master_conn = getMasterConnection(conn, repmgr_schema, options.node, options.cluster_name, + master_conn = getMasterConnection(conn, repmgr_schema, options.cluster_name, &master_id, NULL); if (!master_conn) { @@ -1204,7 +1204,7 @@ do_standby_promote(void) } /* we also need to check if there isn't any master already */ - old_master_conn = getMasterConnection(conn, repmgr_schema, options.node, options.cluster_name, + old_master_conn = getMasterConnection(conn, repmgr_schema, options.cluster_name, &old_master_id, NULL); if (old_master_conn != NULL) { @@ -1309,7 +1309,7 @@ do_standby_follow(void) /* we also need to check if there is any master in the cluster */ log_info(_("%s connecting to master database\n"), progname); - master_conn = getMasterConnection(conn, repmgr_schema, options.node, + master_conn = getMasterConnection(conn, repmgr_schema, options.cluster_name, &master_id,(char *) &master_conninfo); if (master_conn == NULL) { diff --git a/repmgrd.c b/repmgrd.c index 467b732a..e89e196c 100644 --- a/repmgrd.c +++ b/repmgrd.c @@ -257,7 +257,7 @@ main(int argc, char **argv) /* I need the id of the primary as well as a connection to it */ log_info(_("%s Connecting to primary for cluster '%s'\n"), progname, local_options.cluster_name); - primaryConn = getMasterConnection(myLocalConn, repmgr_schema, local_options.node, + primaryConn = getMasterConnection(myLocalConn, repmgr_schema, local_options.cluster_name, &primary_options.node, NULL); if (primaryConn == NULL) @@ -428,7 +428,7 @@ StandbyMonitor(void) log_err(_("We couldn't reconnect to master. Now checking if another node has been promoted.\n")); for (connection_retries = 0; connection_retries < 6; connection_retries++) { - primaryConn = getMasterConnection(myLocalConn, repmgr_schema, local_options.node, + primaryConn = getMasterConnection(myLocalConn, repmgr_schema, local_options.cluster_name, &primary_options.node, NULL); if (PQstatus(primaryConn) == CONNECTION_OK) {