Add a --force option to upgrade an existing PostgreSQL instalation.

This could be useful, for readding recently failed nodes.
This commit is contained in:
Jaime Casanova
2010-10-08 02:55:52 -05:00
parent d42f3e25f4
commit 7dce793882
3 changed files with 51 additions and 11 deletions

View File

@@ -202,3 +202,15 @@ mkdir_p(char *path, mode_t omode)
(void) umask(oumask); (void) umask(oumask);
return retval; return retval;
} }
bool
is_pg_dir(char *dir)
{
char path[8192];
struct stat sb;
sprintf(path, "%s/PG_VERSION", dir);
return (stat(path, &sb) == 0) ? true : false;
}

View File

@@ -7,3 +7,4 @@
int check_dir(char *dir); int check_dir(char *dir);
bool create_directory(char *dir); bool create_directory(char *dir);
bool set_directory_permissions(char *dir); bool set_directory_permissions(char *dir);
bool is_pg_dir(char *dir);

View File

@@ -44,6 +44,7 @@ char *host = NULL;
char *username = NULL; char *username = NULL;
char *dest_dir = NULL; char *dest_dir = NULL;
bool verbose = false; bool verbose = false;
bool force = false;
int numport = 0; int numport = 0;
char *masterport = NULL; char *masterport = NULL;
@@ -62,6 +63,7 @@ main(int argc, char **argv)
{"port", required_argument, NULL, 'p'}, {"port", required_argument, NULL, 'p'},
{"username", required_argument, NULL, 'U'}, {"username", required_argument, NULL, 'U'},
{"dest-dir", required_argument, NULL, 'D'}, {"dest-dir", required_argument, NULL, 'D'},
{"force", no_argument, NULL, 'f'},
{"verbose", no_argument, NULL, 'v'}, {"verbose", no_argument, NULL, 'v'},
{NULL, 0, NULL, 0} {NULL, 0, NULL, 0}
}; };
@@ -87,7 +89,7 @@ main(int argc, char **argv)
} }
while ((c = getopt_long(argc, argv, "d:h:p:U:D:v", long_options, &optindex)) != -1) while ((c = getopt_long(argc, argv, "d:h:p:U:D:fv", long_options, &optindex)) != -1)
{ {
switch (c) switch (c)
{ {
@@ -117,6 +119,9 @@ main(int argc, char **argv)
case 'D': case 'D':
dest_dir = optarg; dest_dir = optarg;
break; break;
case 'f':
force = true;
break;
case 'v': case 'v':
verbose = true; verbose = true;
break; break;
@@ -235,6 +240,7 @@ do_standby_clone(void)
int r; int r;
int i; int i;
bool pg_dir = false;
char master_data_directory[MAXLEN]; char master_data_directory[MAXLEN];
char master_config_file[MAXLEN]; char master_config_file[MAXLEN];
char master_hba_file[MAXLEN]; char master_hba_file[MAXLEN];
@@ -284,7 +290,23 @@ do_standby_clone(void)
fprintf(stderr, fprintf(stderr,
_("%s: directory \"%s\" exists but is not empty\n"), _("%s: directory \"%s\" exists but is not empty\n"),
progname, dest_dir); progname, dest_dir);
return;
pg_dir = is_pg_dir(dest_dir);
if (pg_dir && !force)
{
fprintf(stderr, _("\nThis looks like a PostgreSQL directroy.\n"
"If you are sure you want to clone here, "
"please check there is no PostgreSQL server "
"running and use the --force option\n"));
return;
}
else if (pg_dir && force)
{
/* Let it continue */
break;
}
else
return;
default: default:
/* Trouble accessing directory */ /* Trouble accessing directory */
fprintf(stderr, _("%s: could not access directory \"%s\": %s\n"), fprintf(stderr, _("%s: could not access directory \"%s\": %s\n"),
@@ -357,7 +379,7 @@ do_standby_clone(void)
} }
for (i = 0; i < PQntuples(res); i++) for (i = 0; i < PQntuples(res); i++)
{ {
char *tblspc_dir; char *tblspc_dir = NULL;
strcpy(tblspc_dir, PQgetvalue(res, i, 0)); strcpy(tblspc_dir, PQgetvalue(res, i, 0));
/* Check this directory could be used as a PGDATA dir */ /* Check this directory could be used as a PGDATA dir */
@@ -396,12 +418,15 @@ do_standby_clone(void)
break; break;
case 2: case 2:
/* Present and not empty */ /* Present and not empty */
fprintf(stderr, if (!force)
_("%s: directory \"%s\" exists but is not empty\n"), {
progname, tblspc_dir); fprintf(stderr,
PQclear(res); _("%s: directory \"%s\" exists but is not empty\n"),
PQfinish(conn); progname, tblspc_dir);
return; PQclear(res);
PQfinish(conn);
return;
}
default: default:
/* Trouble accessing directory */ /* Trouble accessing directory */
fprintf(stderr, _("%s: could not access directory \"%s\": %s\n"), fprintf(stderr, _("%s: could not access directory \"%s\": %s\n"),
@@ -815,11 +840,13 @@ copy_remote_files(char *host, char *remote_path, char *local_path, bool is_direc
char options[8192]; char options[8192];
int r; int r;
sprintf(options, "--checksum --compress --progress --rsh=ssh"); sprintf(options, "--archive --checksum --compress --progress --rsh=ssh");
if (force)
strcat(options, " --delete");
if (is_directory) if (is_directory)
{ {
strcat(options, " --archive --exclude=pg_xlog* --exclude=pg_control --exclude=*.pid"); strcat(options, " --exclude=pg_xlog* --exclude=pg_control --exclude=*.pid");
sprintf(script, "rsync %s %s:%s/* %s", sprintf(script, "rsync %s %s:%s/* %s",
options, host, remote_path, local_path); options, host, remote_path, local_path);
} }