Merge remote-tracking branch 'tbrs/master' into heroku

Grab the configuration struct changes. It was expeditious to un-do
some of my by-hand line-wrapping that avoids 80 character limit,
though.

Conflicts:
	config.c
	config.h
	repmgr.c
	repmgr.h
	repmgrd.c
This commit is contained in:
Dan Farina
2011-02-04 18:35:56 -08:00
8 changed files with 138 additions and 127 deletions

140
repmgr.c
View File

@@ -44,7 +44,6 @@
#define STANDBY_PROMOTE 4
#define STANDBY_FOLLOW 5
static void help(const char *progname);
static bool create_recovery_file(const char *data_dir, char *master_conninfo);
static int copy_remote_files(char *host, char *remote_user, char *remote_path,
@@ -78,6 +77,7 @@ char *masterport = NULL;
char *server_mode = NULL;
char *server_cmd = NULL;
repmgr_config config = {};
int
main(int argc, char **argv)
@@ -262,6 +262,17 @@ main(int argc, char **argv)
else
dbname = "postgres";
}
/*
* Read the configuration file: repmgr.conf
*/
parse_config(config_file, &config);
if (config.node == -1)
{
fprintf(stderr, "Node information is missing. "
"Check the configuration file.\n");
exit(1);
}
keywords[2] = "user";
values[2] = username;
@@ -306,25 +317,10 @@ do_master_register(void)
PGresult *res;
char sqlquery[QUERY_STR_LEN];
char myClusterName[MAXLEN];
int myLocalId = -1;
char conninfo[MAXLEN];
bool schema_exists = false;
char master_version[MAXVERSIONSTR];
/*
* Read the configuration file: repmgr.conf
*/
parse_config(config_file, myClusterName, &myLocalId, conninfo);
if (myLocalId == -1)
{
fprintf(stderr, "Node information is missing. "
"Check the configuration file.\n");
exit(1);
}
conn = establishDBConnection(conninfo, true);
conn = establishDBConnection(config.conninfo, true);
/* master should be v9 or better */
pg_version(conn, master_version);
@@ -345,9 +341,7 @@ do_master_register(void)
}
/* Check if there is a schema for this cluster */
sqlquery_snprintf(sqlquery,
"SELECT 1 FROM pg_namespace WHERE nspname = 'repmgr_%s'",
myClusterName);
sqlquery_sprintf(sqlquery, "SELECT 1 FROM pg_namespace WHERE nspname = 'repmgr_%s'", config.cluster_name);
res = PQexec(conn, sqlquery);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
@@ -362,7 +356,7 @@ do_master_register(void)
{
if (!force) /* and we are not forcing so error */
{
fprintf(stderr, "Schema repmgr_%s already exists.", myClusterName);
fprintf(stderr, "Schema repmgr_%s already exists.", config.cluster_name);
PQclear(res);
PQfinish(conn);
return;
@@ -374,11 +368,11 @@ do_master_register(void)
if (!schema_exists)
{
/* ok, create the schema */
sqlquery_snprintf(sqlquery, "CREATE SCHEMA repmgr_%s", myClusterName);
sqlquery_snprintf(sqlquery, "CREATE SCHEMA repmgr_%s", config.cluster_name);
if (!PQexec(conn, sqlquery))
{
fprintf(stderr, "Cannot create the schema repmgr_%s: %s\n",
myClusterName, PQerrorMessage(conn));
config.cluster_name, PQerrorMessage(conn));
PQfinish(conn);
return;
}
@@ -387,12 +381,11 @@ do_master_register(void)
sqlquery_snprintf(sqlquery, "CREATE TABLE repmgr_%s.repl_nodes ( "
" id integer primary key, "
" cluster text not null, "
" conninfo text not null)", myClusterName);
" conninfo text not null)", config.cluster_name);
if (!PQexec(conn, sqlquery))
{
fprintf(stderr,
"Cannot create the table repmgr_%s.repl_nodes: %s\n",
myClusterName, PQerrorMessage(conn));
config.cluster_name, PQerrorMessage(conn));
PQfinish(conn);
return;
}
@@ -404,13 +397,12 @@ do_master_register(void)
" last_wal_primary_location TEXT NOT NULL, "
" last_wal_standby_location TEXT NOT NULL, "
" replication_lag BIGINT NOT NULL, "
" apply_lag BIGINT NOT NULL) ",
" apply_lag BIGINT NOT NULL) ", config.cluster_name);
myClusterName);
if (!PQexec(conn, sqlquery))
{
fprintf(stderr,
"Cannot create the table repmgr_%s.repl_monitor: %s\n",
myClusterName, PQerrorMessage(conn));
config.cluster_name, PQerrorMessage(conn));
PQfinish(conn);
return;
}
@@ -424,12 +416,11 @@ do_master_register(void)
" last_wal_standby_location, pg_size_pretty(replication_lag) replication_lag, "
" pg_size_pretty(apply_lag) apply_lag, age(now(), last_monitor_time) AS time_lag "
" FROM monitor_info a "
" WHERE row_number = 1", myClusterName, myClusterName);
" WHERE row_number = 1", config.cluster_name, config.cluster_name);
if (!PQexec(conn, sqlquery))
{
fprintf(stderr,
"Cannot create the view repmgr_%s.repl_status: %s\n",
myClusterName, PQerrorMessage(conn));
config.cluster_name, PQerrorMessage(conn));
PQfinish(conn);
return;
}
@@ -440,7 +431,7 @@ do_master_register(void)
int id;
/* Ensure there isn't any other master already registered */
master_conn = getMasterConnection(conn, myLocalId, myClusterName, &id,
master_conn = getMasterConnection(conn, config.node, config.cluster_name, &id);
NULL);
if (master_conn != NULL)
{
@@ -455,7 +446,7 @@ do_master_register(void)
{
sqlquery_snprintf(sqlquery, "DELETE FROM repmgr_%s.repl_nodes "
" WHERE id = %d",
myClusterName, myLocalId);
config.cluster_name, config.node);
if (!PQexec(conn, sqlquery))
{
@@ -468,7 +459,7 @@ do_master_register(void)
sqlquery_snprintf(sqlquery, "INSERT INTO repmgr_%s.repl_nodes "
"VALUES (%d, '%s', '%s')",
myClusterName, myLocalId, myClusterName, conninfo);
config.cluster_name, config.node, config.cluster_name, config.conninfo);
if (!PQexec(conn, sqlquery))
{
@@ -493,25 +484,10 @@ do_standby_register(void)
PGresult *res;
char sqlquery[QUERY_STR_LEN];
char myClusterName[MAXLEN];
int myLocalId = -1;
char conninfo[MAXLEN];
char master_version[MAXVERSIONSTR];
char standby_version[MAXVERSIONSTR];
/*
* Read the configuration file: repmgr.conf
*/
parse_config(config_file, myClusterName, &myLocalId, conninfo);
if (myLocalId == -1)
{
fprintf(stderr, "Node information is missing. "
"Check the configuration file.\n");
exit(1);
}
conn = establishDBConnection(conninfo, true);
conn = establishDBConnection(config.conninfo, true);
/* should be v9 or better */
pg_version(conn, standby_version);
@@ -532,7 +508,7 @@ do_standby_register(void)
}
/* Check if there is a schema for this cluster */
sqlquery_snprintf(sqlquery,
sqlquery_snprintf(sqlquery, "SELECT 1 FROM pg_namespace WHERE nspname = 'repmgr_%s'", config.cluster_name);
"SELECT 1 FROM pg_namespace WHERE nspname = 'repmgr_%s'",
myClusterName);
res = PQexec(conn, sqlquery);
@@ -547,7 +523,7 @@ do_standby_register(void)
if (PQntuples(res) == 0) /* schema doesn't exists */
{
fprintf(stderr, "Schema repmgr_%s doesn't exists.", myClusterName);
fprintf(stderr, "Schema repmgr_%s doesn't exists.", config.cluster_name);
PQclear(res);
PQfinish(conn);
return;
@@ -555,7 +531,7 @@ do_standby_register(void)
PQclear(res);
/* check if there is a master in this cluster */
master_conn = getMasterConnection(conn, myLocalId, myClusterName,
master_conn = getMasterConnection(conn, config.node, config.cluster_name, &master_id);
&master_id, NULL);
if (!master_conn)
return;
@@ -587,7 +563,7 @@ do_standby_register(void)
{
sqlquery_snprintf(sqlquery, "DELETE FROM repmgr_%s.repl_nodes "
" WHERE id = %d",
myClusterName, myLocalId);
config.cluster_name, config.node);
if (!PQexec(master_conn, sqlquery))
{
@@ -601,7 +577,7 @@ do_standby_register(void)
sqlquery_snprintf(sqlquery, "INSERT INTO repmgr_%s.repl_nodes "
"VALUES (%d, '%s', '%s')",
myClusterName, myLocalId, myClusterName, conninfo);
config.cluster_name, config.node, config.cluster_name, config.conninfo);
if (!PQexec(master_conn, sqlquery))
{
@@ -749,7 +725,7 @@ do_standby_clone(void)
if (!guc_setted(conn, "wal_keep_segments", ">=", wal_keep_segments))
{
PQfinish(conn);
fprintf(stderr, _("%s needs parameter 'wal_keep_segments' to be set to %s or greater\n"), wal_keep_segments, progname);
fprintf(stderr, _("%s needs parameter 'wal_keep_segments' to be set to %s or greater\n"), progname, wal_keep_segments);
return;
}
if (!guc_setted(conn, "archive_mode", "=", "on"))
@@ -1048,10 +1024,6 @@ do_standby_promote(void)
char sqlquery[QUERY_STR_LEN];
char script[MAXLEN];
char myClusterName[MAXLEN];
int myLocalId = -1;
char conninfo[MAXLEN];
PGconn *old_master_conn;
int old_master_id;
@@ -1062,19 +1034,8 @@ do_standby_promote(void)
char standby_version[MAXVERSIONSTR];
/*
* Read the configuration file: repmgr.conf
*/
parse_config(config_file, myClusterName, &myLocalId, conninfo);
if (myLocalId == -1)
{
fprintf(stderr, "Node information is missing. "
"Check the configuration file.\n");
exit(1);
}
/* We need to connect to check configuration */
conn = establishDBConnection(conninfo, true);
conn = establishDBConnection(config.conninfo, true);
/* we need v9 or better */
pg_version(conn, standby_version);
@@ -1095,8 +1056,8 @@ do_standby_promote(void)
}
/* we also need to check if there isn't any master already */
old_master_conn = getMasterConnection(conn, myLocalId, myClusterName,
&old_master_id, NULL);
old_master_conn = getMasterConnection(conn, config.node, config.cluster_name, &old_master_id);
if (old_master_conn != NULL)
{
PQfinish(old_master_conn);
@@ -1141,8 +1102,7 @@ do_standby_promote(void)
/*
* XXX i'm removing this because it gives an annoying message saying
* couldn't connect but is just the server starting up
*
* conn = establishDBConnection(conninfo, true);
* conn = establishDBConnection(config.conninfo, true);
* if (is_standby(conn))
* fprintf(stderr, "\n%s: STANDBY PROMOTE failed, this is still a standby node.\n", progname);
* else
@@ -1162,11 +1122,7 @@ do_standby_follow(void)
char sqlquery[QUERY_STR_LEN];
char script[MAXLEN];
char myClusterName[MAXLEN];
int myLocalId = -1;
char conninfo[MAXLEN];
char master_conninfo[MAXLEN];
PGconn *master_conn;
int master_id;
@@ -1176,17 +1132,8 @@ do_standby_follow(void)
char master_version[MAXVERSIONSTR];
char standby_version[MAXVERSIONSTR];
/* Read the configuration file: repmgr.conf */
parse_config(config_file, myClusterName, &myLocalId, conninfo);
if (myLocalId == -1)
{
fprintf(stderr, "Node information is missing. "
"Check the configuration file.\n");
exit(1);
}
/* We need to connect to check configuration */
conn = establishDBConnection(conninfo, true);
conn = establishDBConnection(config.conninfo, true);
/* Check we are in a standby node */
if (!is_standby(conn))
@@ -1205,8 +1152,8 @@ do_standby_follow(void)
}
/* we also need to check if there is any master in the cluster */
master_conn = getMasterConnection(conn, myLocalId, myClusterName,
&master_id, master_conninfo);
master_conn = getMasterConnection(conn, config.node, config.cluster_name, &master_id);
if (master_conn == NULL)
{
PQfinish(conn);
@@ -1419,8 +1366,11 @@ copy_remote_files(char *host, char *remote_user, char *remote_path,
char host_string[MAXLEN];
int r;
maxlen_snprintf(options,
"--archive --checksum --compress --progress --rsh=ssh");
if (strnlen(config.rsync_options, QUERY_STR_LEN) == 0)
sprintf(options, "--archive --checksum --compress --progress --rsh=ssh");
else
strncpy(options, config.rsync_options, QUERY_STR_LEN);
if (force)
strcat(options, " --delete");