Ensure read_backup_label() does not exit on error

This would leave an unstopped backup; we'll let do_standby_clone()
do any cleanup necessary before exiting with an error.
This commit is contained in:
Ian Barwick
2016-05-24 17:02:32 +09:00
parent 9b2a907b09
commit b14d8ddb74

View File

@@ -121,7 +121,7 @@ static bool remote_command(const char *host, const char *user, const char *comma
static void format_db_cli_params(const char *conninfo, char *output); static void format_db_cli_params(const char *conninfo, char *output);
static bool copy_file(const char *old_filename, const char *new_filename); static bool copy_file(const char *old_filename, const char *new_filename);
static void read_backup_label(const char *local_data_directory, struct BackupLabel *out_backup_label); static bool read_backup_label(const char *local_data_directory, struct BackupLabel *out_backup_label);
/* Global variables */ /* Global variables */
static const char *keywords[6]; static const char *keywords[6];
@@ -1691,8 +1691,11 @@ do_standby_clone(void)
} }
/* Read backup label copied from primary */ /* Read backup label copied from primary */
/* XXX ensure this function does not exit on error as we'd need to stop the backup */ if (read_backup_label(local_data_directory, &backup_label) == false)
read_backup_label(local_data_directory, &backup_label); {
r = retval = ERR_BAD_BACKUP_LABEL;
goto stop_backup;
}
/* Handle tablespaces */ /* Handle tablespaces */
@@ -2168,8 +2171,7 @@ parse_label_lsn(const char *label_key, const char *label_value)
{ {
log_err(_("Couldn't parse backup label entry \"%s: %s\" as lsn"), log_err(_("Couldn't parse backup label entry \"%s: %s\" as lsn"),
label_key, label_value); label_key, label_value);
return InvalidXLogRecPtr;
exit(ERR_BAD_BACKUP_LABEL);
} }
return ptr; return ptr;
@@ -2190,7 +2192,7 @@ parse_label_lsn(const char *label_key, const char *label_value)
* *
*====================================== *======================================
*/ */
static void static bool
read_backup_label(const char *local_data_directory, struct BackupLabel *out_backup_label) read_backup_label(const char *local_data_directory, struct BackupLabel *out_backup_label)
{ {
char label_path[MAXPGPATH]; char label_path[MAXPGPATH];
@@ -2215,7 +2217,7 @@ read_backup_label(const char *local_data_directory, struct BackupLabel *out_back
{ {
log_err(_("read_backup_label: could not open backup label file %s: %s"), log_err(_("read_backup_label: could not open backup label file %s: %s"),
label_path, strerror(errno)); label_path, strerror(errno));
exit(ERR_BAD_BACKUP_LABEL); return false;
} }
log_info(_("read_backup_label: parsing backup label file '%s'\n"), log_info(_("read_backup_label: parsing backup label file '%s'\n"),
@@ -2237,7 +2239,7 @@ read_backup_label(const char *local_data_directory, struct BackupLabel *out_back
{ {
log_err(_("read_backup_label: line too long in backup label file. Line begins \"%s: %s\""), log_err(_("read_backup_label: line too long in backup label file. Line begins \"%s: %s\""),
label_key, label_value); label_key, label_value);
exit(ERR_BAD_BACKUP_LABEL); return false;
} }
log_debug("standby clone: got backup label entry \"%s: %s\"\n", log_debug("standby clone: got backup label entry \"%s: %s\"\n",
@@ -2249,14 +2251,19 @@ read_backup_label(const char *local_data_directory, struct BackupLabel *out_back
char wal_filename[MAXLEN]; char wal_filename[MAXLEN];
nmatches = sscanf(label_value, "%" MAXLEN_STR "s (file %" MAXLEN_STR "[^)]", start_wal_location, wal_filename); nmatches = sscanf(label_value, "%" MAXLEN_STR "s (file %" MAXLEN_STR "[^)]", start_wal_location, wal_filename);
if (nmatches != 2) if (nmatches != 2)
{ {
log_err(_("read_backup_label: unable to parse \"START WAL LOCATION\" in backup label\n")); log_err(_("read_backup_label: unable to parse \"START WAL LOCATION\" in backup label\n"));
exit(ERR_BAD_BACKUP_LABEL); return false;
} }
out_backup_label->start_wal_location = out_backup_label->start_wal_location =
parse_label_lsn(&label_key[0], start_wal_location); parse_label_lsn(&label_key[0], start_wal_location);
if (out_backup_label->start_wal_location == InvalidXLogRecPtr)
return false;
(void) strncpy(out_backup_label->start_wal_file, wal_filename, MAXLEN); (void) strncpy(out_backup_label->start_wal_file, wal_filename, MAXLEN);
out_backup_label->start_wal_file[MAXLEN-1] = '\0'; out_backup_label->start_wal_file[MAXLEN-1] = '\0';
} }
@@ -2264,6 +2271,9 @@ read_backup_label(const char *local_data_directory, struct BackupLabel *out_back
{ {
out_backup_label->checkpoint_location = out_backup_label->checkpoint_location =
parse_label_lsn(&label_key[0], &label_value[0]); parse_label_lsn(&label_key[0], &label_value[0]);
if (out_backup_label->checkpoint_location == InvalidXLogRecPtr)
return false;
} }
else if (strcmp(label_key, "BACKUP METHOD") == 0) else if (strcmp(label_key, "BACKUP METHOD") == 0)
{ {
@@ -2289,6 +2299,9 @@ read_backup_label(const char *local_data_directory, struct BackupLabel *out_back
{ {
out_backup_label->min_failover_slot_lsn = out_backup_label->min_failover_slot_lsn =
parse_label_lsn(&label_key[0], &label_value[0]); parse_label_lsn(&label_key[0], &label_value[0]);
if (out_backup_label->min_failover_slot_lsn == InvalidXLogRecPtr)
return false;
} }
else else
{ {
@@ -2300,6 +2313,8 @@ read_backup_label(const char *local_data_directory, struct BackupLabel *out_back
(void) fclose(label_file); (void) fclose(label_file);
log_debug(_("read_backup_label: label is %s; start wal file is %s\n"), out_backup_label->label, out_backup_label->start_wal_file); log_debug(_("read_backup_label: label is %s; start wal file is %s\n"), out_backup_label->label, out_backup_label->start_wal_file);
return true;
} }
static void static void