fix: do not exit in is_standby()

Instead we now return an int with 0 meaning „not a standby,“ 1 meaning
„is a standby“ and -1 meaning „connection dropped“
This commit is contained in:
Christian Kruse
2014-01-10 17:11:16 +01:00
parent c41030b40e
commit 4fabfbbbd0
4 changed files with 62 additions and 33 deletions

View File

@@ -71,25 +71,22 @@ establishDBConnectionByParams(const char *keywords[], const char *values[],const
return conn; return conn;
} }
bool int
is_standby(PGconn *conn) is_standby(PGconn *conn)
{ {
PGresult *res; PGresult *res;
bool result = false; int result = 0;
res = PQexec(conn, "SELECT pg_is_in_recovery()"); res = PQexec(conn, "SELECT pg_is_in_recovery()");
if (PQresultStatus(res) != PGRES_TUPLES_OK) if (res == NULL || PQresultStatus(res) != PGRES_TUPLES_OK)
{ {
log_err(_("Can't query server mode: %s"), log_err(_("Can't query server mode: %s"),
PQerrorMessage(conn)); PQerrorMessage(conn));
PQclear(res); result = -1;
PQfinish(conn);
exit(ERR_DB_QUERY);
} }
else if (PQntuples(res) == 1 && strcmp(PQgetvalue(res, 0, 0), "t") == 0)
if (PQntuples(res) == 1 && strcmp(PQgetvalue(res, 0, 0), "t") == 0) result = 1;
result = true;
PQclear(res); PQclear(res);
return result; return result;

View File

@@ -26,7 +26,7 @@ PGconn *establishDBConnection(const char *conninfo, const bool exit_on_error);
PGconn *establishDBConnectionByParams(const char *keywords[], PGconn *establishDBConnectionByParams(const char *keywords[],
const char *values[], const char *values[],
const bool exit_on_error); const bool exit_on_error);
bool is_standby(PGconn *conn); int is_standby(PGconn *conn);
bool is_witness(PGconn *conn, char *schema, char *cluster, int node_id); bool is_witness(PGconn *conn, char *schema, char *cluster, int node_id);
bool is_pgup(PGconn *conn, int timeout); bool is_pgup(PGconn *conn, int timeout);
char *pg_version(PGconn *conn, char* major_version); char *pg_version(PGconn *conn, char* major_version);

View File

@@ -491,6 +491,7 @@ do_master_register(void)
bool schema_exists = false; bool schema_exists = false;
char schema_quoted[MAXLEN]; char schema_quoted[MAXLEN];
char master_version[MAXVERSIONSTR]; char master_version[MAXVERSIONSTR];
int ret;
conn = establishDBConnection(options.conninfo, true); conn = establishDBConnection(options.conninfo, true);
@@ -506,9 +507,13 @@ do_master_register(void)
/* Check we are a master */ /* Check we are a master */
log_info(_("%s connected to master, checking its state\n"), progname); log_info(_("%s connected to master, checking its state\n"), progname);
if (is_standby(conn)) ret = is_standby(conn);
if (ret)
{ {
log_err(_("Trying to register a standby node as a master\n")); log_err(_(ret == 1 ? "Trying to register a standby node as a master\n" :
"Connection to node lost!\n"));
PQfinish(conn); PQfinish(conn);
exit(ERR_BAD_CONFIG); exit(ERR_BAD_CONFIG);
} }
@@ -620,7 +625,7 @@ do_standby_register(void)
{ {
PGconn *conn; PGconn *conn;
PGconn *master_conn; PGconn *master_conn;
int master_id; int master_id, ret;
PGresult *res; PGresult *res;
char sqlquery[QUERY_STR_LEN]; char sqlquery[QUERY_STR_LEN];
@@ -645,9 +650,12 @@ do_standby_register(void)
} }
/* Check we are a standby */ /* Check we are a standby */
if (!is_standby(conn)) ret = is_standby(conn);
if (ret == 0 || ret == -1)
{ {
log_err(_("repmgr: This node should be a standby (%s)\n"), options.conninfo); log_err(_(ret == 0 ? "repmgr: This node should be a standby (%s)\n" :
"repmgr: connection to node (%s) lost\n"), options.conninfo);
PQfinish(conn); PQfinish(conn);
exit(ERR_BAD_CONFIG); exit(ERR_BAD_CONFIG);
} }
@@ -770,7 +778,7 @@ do_standby_clone(void)
char sqlquery[QUERY_STR_LEN]; char sqlquery[QUERY_STR_LEN];
int r = 0, retval = SUCCESS; int r = 0, retval = SUCCESS;
int i; int i, is_standby_retval;
bool flag_success = false; bool flag_success = false;
bool test_mode = false; bool test_mode = false;
@@ -830,10 +838,13 @@ do_standby_clone(void)
} }
/* Check we are cloning a primary node */ /* Check we are cloning a primary node */
if (is_standby(conn)) is_standby_retval = is_standby(conn);
if (is_standby_retval)
{ {
log_err(_(is_standby_retval == 1 ? "The command should clone a primary node\n" :
"Connection to node lost!\n"));
PQfinish(conn); PQfinish(conn);
log_err(_("\nThe command should clone a primary node\n"));
exit(ERR_BAD_CONFIG); exit(ERR_BAD_CONFIG);
} }
@@ -1253,7 +1264,7 @@ do_standby_promote(void)
PGconn *old_master_conn; PGconn *old_master_conn;
int old_master_id; int old_master_id;
int r; int r, retval;
char data_dir[MAXLEN]; char data_dir[MAXLEN];
char recovery_file_path[MAXFILENAME]; char recovery_file_path[MAXFILENAME];
char recovery_done_path[MAXFILENAME]; char recovery_done_path[MAXFILENAME];
@@ -1275,9 +1286,12 @@ do_standby_promote(void)
} }
/* Check we are in a standby node */ /* Check we are in a standby node */
if (!is_standby(conn)) retval = is_standby(conn);
if (retval == 0 || retval == -1)
{ {
log_err(_("%s: The command should be executed on a standby node\n"), progname); log_err(_(retval == 0 ? "%s: The command should be executed on a standby node\n" :
"%s: connection to node lost!\n"), progname);
PQfinish(conn); PQfinish(conn);
exit(ERR_BAD_CONFIG); exit(ERR_BAD_CONFIG);
} }
@@ -1333,9 +1347,11 @@ do_standby_promote(void)
/* reconnect to check we got promoted */ /* reconnect to check we got promoted */
log_info(_("%s connecting to now restarted database\n"), progname); log_info(_("%s connecting to now restarted database\n"), progname);
conn = establishDBConnection(options.conninfo, true); conn = establishDBConnection(options.conninfo, true);
if (is_standby(conn)) retval = is_standby(conn);
if (retval)
{ {
log_err(_("\n%s: STANDBY PROMOTE failed, this is still a standby node.\n"), progname); log_err(_(retval == 1 ? "%s: STANDBY PROMOTE failed, this is still a standby node.\n" :
"%s: connection to node lost!\n"), progname);
} }
else else
{ {
@@ -1357,7 +1373,7 @@ do_standby_follow(void)
PGconn *master_conn; PGconn *master_conn;
int master_id; int master_id;
int r; int r, retval;
char data_dir[MAXLEN]; char data_dir[MAXLEN];
char master_version[MAXVERSIONSTR]; char master_version[MAXVERSIONSTR];
@@ -1369,9 +1385,12 @@ do_standby_follow(void)
/* Check we are in a standby node */ /* Check we are in a standby node */
log_info(_("%s connected to standby, checking its state\n"), progname); log_info(_("%s connected to standby, checking its state\n"), progname);
if (!is_standby(conn)) retval = is_standby(conn);
if (retval == 0 || retval == -1)
{ {
log_err(_("\n%s: The command should be executed in a standby node\n"), progname); log_err(_(retval == 0 ? "%s: The command should be executed in a standby node\n" :
"%s: connection to node lost!\n"), progname);
PQfinish(conn); PQfinish(conn);
exit(ERR_BAD_CONFIG); exit(ERR_BAD_CONFIG);
} }
@@ -1406,9 +1425,12 @@ do_standby_follow(void)
} }
/* Check we are going to point to a master */ /* Check we are going to point to a master */
if (is_standby(master_conn)) retval = is_standby(master_conn);
if (retval)
{ {
log_err(_("%s: The node to follow should be a master\n"), progname); log_err(_(retval == 1 ? "%s: The node to follow should be a master\n" :
"%s: connection to node lost!\n"), progname);
PQfinish(conn); PQfinish(conn);
PQfinish(master_conn); PQfinish(master_conn);
exit(ERR_BAD_CONFIG); exit(ERR_BAD_CONFIG);
@@ -1491,7 +1513,7 @@ do_witness_create(void)
char buf[MAXLEN]; char buf[MAXLEN];
FILE *pg_conf = NULL; FILE *pg_conf = NULL;
int r = 0; int r = 0, retval;
int i; int i;
char master_version[MAXVERSIONSTR]; char master_version[MAXVERSIONSTR];
@@ -1522,9 +1544,12 @@ do_witness_create(void)
} }
/* Check we are connecting to a primary node */ /* Check we are connecting to a primary node */
if (is_standby(masterconn)) retval = is_standby(masterconn);
if (retval)
{ {
log_err(_("The command should not run on a standby node\n")); log_err(_(retval == 1 ? "The command should not run on a standby node\n" :
"Connection to node lost!\n"));
PQfinish(masterconn); PQfinish(masterconn);
exit(ERR_BAD_CONFIG); exit(ERR_BAD_CONFIG);
} }

View File

@@ -165,7 +165,7 @@ main(int argc, char **argv)
}; };
int optindex; int optindex;
int c; int c, ret;
bool daemonize = false; bool daemonize = false;
char standby_version[MAXVERSIONSTR]; char standby_version[MAXVERSIONSTR];
@@ -301,14 +301,21 @@ main(int argc, char **argv)
*/ */
do do
{ {
ret = is_standby(myLocalConn);
/* /*
* Set my server mode, establish a connection to primary * Set my server mode, establish a connection to primary
* and start monitor * and start monitor
*/ */
if (is_witness(myLocalConn, repmgr_schema, local_options.cluster_name, local_options.node)) if (is_witness(myLocalConn, repmgr_schema, local_options.cluster_name, local_options.node))
myLocalMode = WITNESS_MODE; myLocalMode = WITNESS_MODE;
else if (is_standby(myLocalConn)) else if (ret == 1)
myLocalMode = STANDBY_MODE; myLocalMode = STANDBY_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)
exit(1);
else /* is the master */ else /* is the master */
myLocalMode = PRIMARY_MODE; myLocalMode = PRIMARY_MODE;