diff --git a/src/backup.c b/src/backup.c index 69735143..38ea22eb 100644 --- a/src/backup.c +++ b/src/backup.c @@ -536,7 +536,7 @@ do_backup_instance(void) prev_backup_start_lsn = prev_backup->start_lsn; current.parent_backup = prev_backup->start_time; - pgBackupWriteBackupControlFile(¤t); + write_backup(¤t); } /* @@ -911,11 +911,13 @@ do_backup(time_t start_time) /* Start backup. Update backup status. */ current.status = BACKUP_STATUS_RUNNING; current.start_time = start_time; + StrNCpy(current.program_version, PROGRAM_VERSION, + sizeof(current.program_version)); /* Create backup directory and BACKUP_CONTROL_FILE */ if (pgBackupCreateDir(¤t)) elog(ERROR, "cannot create backup directory"); - pgBackupWriteBackupControlFile(¤t); + write_backup(¤t); elog(LOG, "Backup destination is initialized"); @@ -937,7 +939,7 @@ do_backup(time_t start_time) /* Backup is done. Update backup status */ current.end_time = time(NULL); current.status = BACKUP_STATUS_DONE; - pgBackupWriteBackupControlFile(¤t); + write_backup(¤t); //elog(LOG, "Backup completed. Total bytes : " INT64_FORMAT "", // current.data_bytes); @@ -2015,7 +2017,7 @@ backup_cleanup(bool fatal, void *userdata) base36enc(current.start_time)); current.end_time = time(NULL); current.status = BACKUP_STATUS_ERROR; - pgBackupWriteBackupControlFile(¤t); + write_backup(¤t); } /* diff --git a/src/catalog.c b/src/catalog.c index c0e9e75c..05992318 100644 --- a/src/catalog.c +++ b/src/catalog.c @@ -216,6 +216,25 @@ read_backup(time_t timestamp) return readBackupControlFile(conf_path); } +/* + * Save the backup status into BACKUP_CONTROL_FILE. + * + * We need to reread the backup using its ID and save it changing only its + * status. + */ +void +write_backup_status(pgBackup *backup) +{ + pgBackup *tmp; + + tmp = read_backup(backup->start_time); + + tmp->status = backup->status; + write_backup(tmp); + + pgBackupFree(tmp); +} + /* * Get backup_mode in string representation. */ @@ -426,7 +445,8 @@ pgBackupWriteControl(FILE *out, pgBackup *backup) fprintf(out, "block-size = %u\n", backup->block_size); fprintf(out, "xlog-block-size = %u\n", backup->wal_block_size); fprintf(out, "checksum-version = %u\n", backup->checksum_version); - fprintf(out, "program-version = %s\n", PROGRAM_VERSION); + if (backup->program_version[0] != '\0') + fprintf(out, "program-version = %s\n", backup->program_version); if (backup->server_version[0] != '\0') fprintf(out, "server-version = %s\n", backup->server_version); @@ -476,17 +496,19 @@ pgBackupWriteControl(FILE *out, pgBackup *backup) fprintf(out, "primary_conninfo = '%s'\n", backup->primary_conninfo); } -/* create BACKUP_CONTROL_FILE */ +/* + * Save the backup content into BACKUP_CONTROL_FILE. + */ void -pgBackupWriteBackupControlFile(pgBackup *backup) +write_backup(pgBackup *backup) { FILE *fp = NULL; - char ini_path[MAXPGPATH]; + char conf_path[MAXPGPATH]; - pgBackupGetPath(backup, ini_path, lengthof(ini_path), BACKUP_CONTROL_FILE); - fp = fopen(ini_path, "wt"); + pgBackupGetPath(backup, conf_path, lengthof(conf_path), BACKUP_CONTROL_FILE); + fp = fopen(conf_path, "wt"); if (fp == NULL) - elog(ERROR, "cannot open configuration file \"%s\": %s", ini_path, + elog(ERROR, "Cannot open configuration file \"%s\": %s", conf_path, strerror(errno)); pgBackupWriteControl(fp, backup); diff --git a/src/delete.c b/src/delete.c index 5d75c64f..417a0950 100644 --- a/src/delete.c +++ b/src/delete.c @@ -269,7 +269,7 @@ delete_backup_files(pgBackup *backup) * the error occurs before deleting all backup files. */ backup->status = BACKUP_STATUS_DELETING; - pgBackupWriteBackupControlFile(backup); + write_backup_status(backup); /* list files to be deleted */ files = parray_new(); diff --git a/src/merge.c b/src/merge.c index 0230853d..40e83ede 100644 --- a/src/merge.c +++ b/src/merge.c @@ -167,10 +167,10 @@ merge_backups(pgBackup *to_backup, pgBackup *from_backup) elog(LOG, "Merging backup %s with backup %s", from_backup_id, to_backup_id); to_backup->status = BACKUP_STATUS_MERGING; - pgBackupWriteBackupControlFile(to_backup); + write_backup_status(to_backup); from_backup->status = BACKUP_STATUS_MERGING; - pgBackupWriteBackupControlFile(from_backup); + write_backup_status(from_backup); /* * Make backup paths. @@ -326,7 +326,7 @@ merge_backups(pgBackup *to_backup, pgBackup *from_backup) to_backup->wal_bytes = BYTES_INVALID; pgBackupWriteFileList(to_backup, files, from_database_path); - pgBackupWriteBackupControlFile(to_backup); + write_backup_status(to_backup); /* Cleanup */ pfree(threads_args); diff --git a/src/parsexlog.c b/src/parsexlog.c index e07c284f..bf774c28 100644 --- a/src/parsexlog.c +++ b/src/parsexlog.c @@ -476,7 +476,7 @@ validate_backup_wal_from_start_to_stop(pgBackup *backup, * the backup is definitely corrupted. Update its status. */ backup->status = BACKUP_STATUS_CORRUPT; - pgBackupWriteBackupControlFile(backup); + write_backup_status(backup); elog(WARNING, "There are not enough WAL records to consistenly restore " "backup %s from START LSN: %X/%X to STOP LSN: %X/%X", diff --git a/src/pg_probackup.h b/src/pg_probackup.h index 1a7c65df..cd57bb5b 100644 --- a/src/pg_probackup.h +++ b/src/pg_probackup.h @@ -445,6 +445,9 @@ extern int do_validate_all(void); /* in catalog.c */ extern pgBackup *read_backup(time_t timestamp); +extern void write_backup(pgBackup *backup); +extern void write_backup_status(pgBackup *backup); + extern const char *pgBackupGetBackupMode(pgBackup *backup); extern parray *catalog_get_backup_list(time_t requested_backup_id); @@ -452,7 +455,6 @@ extern pgBackup *catalog_get_last_data_backup(parray *backup_list, TimeLineID tli); extern void catalog_lock(void); extern void pgBackupWriteControl(FILE *out, pgBackup *backup); -extern void pgBackupWriteBackupControlFile(pgBackup *backup); extern void pgBackupWriteFileList(pgBackup *backup, parray *files, const char *root); diff --git a/src/restore.c b/src/restore.c index 756327f0..95a104d6 100644 --- a/src/restore.c +++ b/src/restore.c @@ -208,7 +208,7 @@ do_restore_or_validate(time_t target_backup_id, pgRecoveryTarget *rt, if (backup->status == BACKUP_STATUS_OK) { backup->status = BACKUP_STATUS_ORPHAN; - pgBackupWriteBackupControlFile(backup); + write_backup_status(backup); elog(WARNING, "Backup %s is orphaned because his parent %s is missing", base36enc(backup->start_time), missing_backup_id); @@ -241,10 +241,13 @@ do_restore_or_validate(time_t target_backup_id, pgRecoveryTarget *rt, if (backup->status == BACKUP_STATUS_OK) { backup->status = BACKUP_STATUS_ORPHAN; - pgBackupWriteBackupControlFile(backup); - elog(WARNING, "Backup %s is orphaned because his parent %s has status: %s", - base36enc(backup->start_time), parent_backup_id, - status2str(tmp_backup->status)); + write_backup_status(backup); + + elog(WARNING, + "Backup %s is orphaned because his parent %s has status: %s", + base36enc(backup->start_time), + parent_backup_id, + status2str(tmp_backup->status)); } else { @@ -336,7 +339,7 @@ do_restore_or_validate(time_t target_backup_id, pgRecoveryTarget *rt, if (backup->status == BACKUP_STATUS_OK) { backup->status = BACKUP_STATUS_ORPHAN; - pgBackupWriteBackupControlFile(backup); + write_backup_status(backup); elog(WARNING, "Backup %s is orphaned because his parent %s has status: %s", base36enc(backup->start_time), diff --git a/src/utils/pgut.c b/src/utils/pgut.c index abc0708d..ec3fd8bb 100644 --- a/src/utils/pgut.c +++ b/src/utils/pgut.c @@ -241,7 +241,7 @@ assign_option(pgut_option *opt, const char *optarg, pgut_optsrc src) *(char **) opt->var = pgut_strdup(optarg); if (strcmp(optarg,"") != 0) return; - message = "a valid string. But provided: "; + message = "a valid string"; break; case 't': if (parse_time(optarg, opt->var, diff --git a/src/validate.c b/src/validate.c index c003f35f..d0c77980 100644 --- a/src/validate.c +++ b/src/validate.c @@ -135,7 +135,7 @@ pgBackupValidate(pgBackup *backup) /* Update backup status */ backup->status = corrupted ? BACKUP_STATUS_CORRUPT : BACKUP_STATUS_OK; - pgBackupWriteBackupControlFile(backup); + write_backup_status(backup); if (corrupted) elog(WARNING, "Backup %s data files are corrupted", base36enc(backup->start_time)); @@ -340,7 +340,7 @@ do_validate_instance(void) if (current_backup->status == BACKUP_STATUS_OK) { current_backup->status = BACKUP_STATUS_ORPHAN; - pgBackupWriteBackupControlFile(current_backup); + write_backup_status(current_backup); elog(WARNING, "Backup %s is orphaned because his parent %s is missing", base36enc(current_backup->start_time), parent_backup_id); @@ -365,7 +365,7 @@ do_validate_instance(void) if (current_backup->status == BACKUP_STATUS_OK) { current_backup->status = BACKUP_STATUS_ORPHAN; - pgBackupWriteBackupControlFile(current_backup); + write_backup_status(current_backup); elog(WARNING, "Backup %s is orphaned because his parent %s has status: %s", base36enc(current_backup->start_time), parent_backup_id, status2str(tmp_backup->status)); @@ -422,7 +422,7 @@ do_validate_instance(void) if (backup->status == BACKUP_STATUS_OK) { backup->status = BACKUP_STATUS_ORPHAN; - pgBackupWriteBackupControlFile(backup); + write_backup_status(backup); elog(WARNING, "Backup %s is orphaned because his parent %s has status: %s", base36enc(backup->start_time),