Parse pg_basebackup option --waldir/--xlogdir

This commit is contained in:
Ian Barwick
2020-10-06 18:00:11 +09:00
parent 679cfe0852
commit b3b9281253
3 changed files with 31 additions and 8 deletions

View File

@@ -2056,17 +2056,12 @@ bool
parse_pg_basebackup_options(const char *pg_basebackup_options, t_basebackup_options *backup_options, int server_version_num, ItemList *error_list) parse_pg_basebackup_options(const char *pg_basebackup_options, t_basebackup_options *backup_options, int server_version_num, ItemList *error_list)
{ {
bool backup_options_ok = true; bool backup_options_ok = true;
int c = 0, int c = 0,
argc_item = 0; argc_item = 0;
char **argv_array = NULL; char **argv_array = NULL;
int optindex = 0; int optindex = 0;
struct option *long_options = NULL; struct option *long_options = NULL;
/* /*
* We're only interested in these options. * We're only interested in these options.
*/ */
@@ -2075,7 +2070,8 @@ parse_pg_basebackup_options(const char *pg_basebackup_options, t_basebackup_opti
{ {
{"slot", required_argument, NULL, 'S'}, {"slot", required_argument, NULL, 'S'},
{"wal-method", required_argument, NULL, 'X'}, {"wal-method", required_argument, NULL, 'X'},
{"no-slot", no_argument, NULL, 1}, {"waldir", required_argument, NULL, 1},
{"no-slot", no_argument, NULL, 2},
{NULL, 0, NULL, 0} {NULL, 0, NULL, 0}
}; };
@@ -2086,6 +2082,7 @@ parse_pg_basebackup_options(const char *pg_basebackup_options, t_basebackup_opti
{ {
{"slot", required_argument, NULL, 'S'}, {"slot", required_argument, NULL, 'S'},
{"xlog-method", required_argument, NULL, 'X'}, {"xlog-method", required_argument, NULL, 'X'},
{"xlogdir", required_argument, NULL, 1},
{NULL, 0, NULL, 0} {NULL, 0, NULL, 0}
}; };
@@ -2119,10 +2116,13 @@ parse_pg_basebackup_options(const char *pg_basebackup_options, t_basebackup_opti
strncpy(backup_options->wal_method, optarg, MAXLEN); strncpy(backup_options->wal_method, optarg, MAXLEN);
break; break;
case 1: case 1:
strncpy(backup_options->waldir, optarg, MAXPGPATH);
break;
case 2:
backup_options->no_slot = true; backup_options->no_slot = true;
break; break;
case '?': case '?':
if (server_version_num >= 100000 && optopt == 1) if (server_version_num >= 100000 && optopt == 2)
{ {
if (error_list != NULL) if (error_list != NULL)
{ {
@@ -2143,6 +2143,24 @@ parse_pg_basebackup_options(const char *pg_basebackup_options, t_basebackup_opti
backup_options_ok = false; backup_options_ok = false;
} }
/*
* If --waldir/--xlogdir provided, check it's an absolute path.
*/
if (backup_options->waldir[0] != '\0')
{
canonicalize_path(backup_options->waldir);
if (!is_absolute_path(backup_options->waldir))
{
if (error_list != NULL)
{
item_list_append_format(error_list,
"--%s must be provided with an absolute path",
server_version_num >= 100000 ? "waldir" : "xlogdir");
}
backup_options_ok = false;
}
}
free_parsed_argv(&argv_array); free_parsed_argv(&argv_array);
return backup_options_ok; return backup_options_ok;

View File

@@ -262,10 +262,11 @@ typedef struct
{ {
char slot[MAXLEN]; char slot[MAXLEN];
char wal_method[MAXLEN]; char wal_method[MAXLEN];
char waldir[MAXPGPATH];
bool no_slot; /* from PostgreSQL 10 */ bool no_slot; /* from PostgreSQL 10 */
} t_basebackup_options; } t_basebackup_options;
#define T_BASEBACKUP_OPTIONS_INITIALIZER { "", "", false } #define T_BASEBACKUP_OPTIONS_INITIALIZER { "", "", "", false }
typedef enum typedef enum

View File

@@ -7203,6 +7203,10 @@ run_file_backup(t_node_info *local_node_record)
if (vers[i] < 0 && source_server_version_num >= abs(vers[i])) if (vers[i] < 0 && source_server_version_num >= abs(vers[i]))
continue; continue;
/*
* If --waldir/--xlogdir specified in "pg_basebackup_options",
* create a symlink rather than make a directory.
*/
maxlen_snprintf(filename, "%s/%s", local_data_directory, dirs[i]); maxlen_snprintf(filename, "%s/%s", local_data_directory, dirs[i]);
if (mkdir(filename, S_IRWXU) != 0 && errno != EEXIST) if (mkdir(filename, S_IRWXU) != 0 && errno != EEXIST)
{ {