mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-27 00:46:29 +00:00
Add a --force option to upgrade an existing PostgreSQL instalation.
This could be useful, for readding recently failed nodes.
This commit is contained in:
12
check_dir.c
12
check_dir.c
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
49
repmgr.c
49
repmgr.c
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user