mirror of
https://github.com/postgrespro/pg_probackup.git
synced 2026-06-21 01:34:15 +02:00
Refactoring. Use instanceState instead of global variable instance_name
This commit is contained in:
+7
-7
@@ -47,7 +47,7 @@ static void backup_cleanup(bool fatal, void *userdata);
|
||||
|
||||
static void *backup_files(void *arg);
|
||||
|
||||
static void do_backup_instance(PGconn *backup_conn, PGNodeInfo *nodeInfo, bool no_sync, bool backup_logs);
|
||||
static void do_backup_pg(PGconn *backup_conn, PGNodeInfo *nodeInfo, bool no_sync, bool backup_logs);
|
||||
|
||||
static void pg_start_backup(const char *label, bool smooth, pgBackup *backup,
|
||||
PGNodeInfo *nodeInfo, PGconn *conn);
|
||||
@@ -92,7 +92,7 @@ backup_stopbackup_callback(bool fatal, void *userdata)
|
||||
* Move files from 'pgdata' to a subdirectory in backup catalog.
|
||||
*/
|
||||
static void
|
||||
do_backup_instance(PGconn *backup_conn, PGNodeInfo *nodeInfo, bool no_sync, bool backup_logs)
|
||||
do_backup_pg(PGconn *backup_conn, PGNodeInfo *nodeInfo, bool no_sync, bool backup_logs)
|
||||
{
|
||||
int i;
|
||||
char external_prefix[MAXPGPATH]; /* Temp value. Used as template */
|
||||
@@ -724,7 +724,7 @@ pgdata_basic_setup(ConnectionOptions conn_opt, PGNodeInfo *nodeInfo)
|
||||
* Entry point of pg_probackup BACKUP subcommand.
|
||||
*/
|
||||
int
|
||||
do_backup(pgSetBackupParams *set_backup_params,
|
||||
do_backup(InstanceState *instanceState, pgSetBackupParams *set_backup_params,
|
||||
bool no_validate, bool no_sync, bool backup_logs)
|
||||
{
|
||||
PGconn *backup_conn = NULL;
|
||||
@@ -740,7 +740,7 @@ do_backup(pgSetBackupParams *set_backup_params,
|
||||
current.external_dir_str = instance_config.external_dir_str;
|
||||
|
||||
/* Create backup directory and BACKUP_CONTROL_FILE */
|
||||
pgBackupCreateDir(¤t, backup_instance_path);
|
||||
pgBackupCreateDir(¤t, instanceState->instance_backup_subdir_path);
|
||||
|
||||
if (!instance_config.pgdata)
|
||||
elog(ERROR, "required parameter not specified: PGDATA "
|
||||
@@ -758,7 +758,7 @@ do_backup(pgSetBackupParams *set_backup_params,
|
||||
|
||||
elog(INFO, "Backup start, pg_probackup version: %s, instance: %s, backup ID: %s, backup mode: %s, "
|
||||
"wal mode: %s, remote: %s, compress-algorithm: %s, compress-level: %i",
|
||||
PROGRAM_VERSION, instance_name, base36enc(current.backup_id), pgBackupGetBackupMode(¤t, false),
|
||||
PROGRAM_VERSION, instanceState->instance_name, base36enc(current.backup_id), pgBackupGetBackupMode(¤t, false),
|
||||
current.stream ? "STREAM" : "ARCHIVE", IsSshProtocol() ? "true" : "false",
|
||||
deparse_compress_alg(current.compress_alg), current.compress_level);
|
||||
|
||||
@@ -824,7 +824,7 @@ do_backup(pgSetBackupParams *set_backup_params,
|
||||
add_note(¤t, set_backup_params->note);
|
||||
|
||||
/* backup data */
|
||||
do_backup_instance(backup_conn, &nodeInfo, no_sync, backup_logs);
|
||||
do_backup_pg(backup_conn, &nodeInfo, no_sync, backup_logs);
|
||||
pgut_atexit_pop(backup_cleanup, NULL);
|
||||
|
||||
/* compute size of wal files of this backup stored in the archive */
|
||||
@@ -879,7 +879,7 @@ do_backup(pgSetBackupParams *set_backup_params,
|
||||
* which are expired according to retention policies
|
||||
*/
|
||||
if (delete_expired || merge_expired || delete_wal)
|
||||
do_retention();
|
||||
do_retention(instanceState);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+1
-1
@@ -112,7 +112,7 @@ read_backup(const char *root_dir)
|
||||
*/
|
||||
void
|
||||
write_backup_status(pgBackup *backup, BackupStatus status,
|
||||
const char *instance_name, bool strict)
|
||||
bool strict)
|
||||
{
|
||||
pgBackup *tmp;
|
||||
|
||||
|
||||
+8
-8
@@ -29,7 +29,7 @@ static bool backup_merged = false; /* At least one merge was enacted */
|
||||
static bool wal_deleted = false; /* At least one WAL segments was deleted */
|
||||
|
||||
void
|
||||
do_delete(time_t backup_id)
|
||||
do_delete(InstanceState *instanceState, time_t backup_id)
|
||||
{
|
||||
int i;
|
||||
parray *backup_list,
|
||||
@@ -39,7 +39,7 @@ do_delete(time_t backup_id)
|
||||
char size_to_delete_pretty[20];
|
||||
|
||||
/* Get complete list of backups */
|
||||
backup_list = catalog_get_backup_list(instance_name, INVALID_BACKUP_ID);
|
||||
backup_list = catalog_get_backup_list(instanceState->instance_name, INVALID_BACKUP_ID);
|
||||
|
||||
delete_list = parray_new();
|
||||
|
||||
@@ -123,7 +123,7 @@ do_delete(time_t backup_id)
|
||||
* which FULL backup should be keeped for redundancy obligation(only valid do),
|
||||
* but if invalid backup is not guarded by retention - it is removed
|
||||
*/
|
||||
void do_retention(void)
|
||||
void do_retention(InstanceState *instanceState)
|
||||
{
|
||||
parray *backup_list = NULL;
|
||||
parray *to_keep_list = parray_new();
|
||||
@@ -139,7 +139,7 @@ void do_retention(void)
|
||||
MyLocation = FIO_LOCAL_HOST;
|
||||
|
||||
/* Get a complete list of backups. */
|
||||
backup_list = catalog_get_backup_list(instance_name, INVALID_BACKUP_ID);
|
||||
backup_list = catalog_get_backup_list(instanceState->instance_name, INVALID_BACKUP_ID);
|
||||
|
||||
if (parray_num(backup_list) == 0)
|
||||
backup_list_is_empty = true;
|
||||
@@ -750,7 +750,7 @@ delete_backup_files(pgBackup *backup)
|
||||
* Update STATUS to BACKUP_STATUS_DELETING in preparation for the case which
|
||||
* the error occurs before deleting all backup files.
|
||||
*/
|
||||
write_backup_status(backup, BACKUP_STATUS_DELETING, instance_name, false);
|
||||
write_backup_status(backup, BACKUP_STATUS_DELETING, false);
|
||||
|
||||
/* list files to be deleted */
|
||||
files = parray_new();
|
||||
@@ -966,7 +966,7 @@ delete_walfiles_in_tli(XLogRecPtr keep_lsn, timelineInfo *tlinfo,
|
||||
|
||||
/* Delete all backup files and wal files of given instance. */
|
||||
int
|
||||
do_delete_instance(void)
|
||||
do_delete_instance(InstanceState *instanceState)
|
||||
{
|
||||
parray *backup_list;
|
||||
int i;
|
||||
@@ -974,7 +974,7 @@ do_delete_instance(void)
|
||||
|
||||
|
||||
/* Delete all backups. */
|
||||
backup_list = catalog_get_backup_list(instance_name, INVALID_BACKUP_ID);
|
||||
backup_list = catalog_get_backup_list(instanceState->instance_name, INVALID_BACKUP_ID);
|
||||
|
||||
catalog_lock_backup_list(backup_list, 0, parray_num(backup_list) - 1, true, true);
|
||||
|
||||
@@ -1008,7 +1008,7 @@ do_delete_instance(void)
|
||||
elog(ERROR, "Can't remove \"%s\": %s", arclog_path,
|
||||
strerror(errno));
|
||||
|
||||
elog(INFO, "Instance '%s' successfully deleted", instance_name);
|
||||
elog(INFO, "Instance '%s' successfully deleted", instanceState->instance_name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -121,6 +121,6 @@ do_add_instance(InstanceState *instanceState, InstanceConfig *instance)
|
||||
/* pgdata was set through command line */
|
||||
do_set_config(true);
|
||||
|
||||
elog(INFO, "Instance '%s' successfully inited", instance_name);
|
||||
elog(INFO, "Instance '%s' successfully inited", instanceState->instance_name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
+4
-4
@@ -68,7 +68,7 @@ static bool is_forward_compatible(parray *parent_chain);
|
||||
* - Remove unnecessary files, which doesn't exist in the target backup anymore
|
||||
*/
|
||||
void
|
||||
do_merge(time_t backup_id)
|
||||
do_merge(InstanceState *instanceState, time_t backup_id)
|
||||
{
|
||||
parray *backups;
|
||||
parray *merge_list = parray_new();
|
||||
@@ -80,13 +80,13 @@ do_merge(time_t backup_id)
|
||||
if (backup_id == INVALID_BACKUP_ID)
|
||||
elog(ERROR, "required parameter is not specified: --backup-id");
|
||||
|
||||
if (instance_name == NULL)
|
||||
if (instanceState == NULL)
|
||||
elog(ERROR, "required parameter is not specified: --instance");
|
||||
|
||||
elog(INFO, "Merge started");
|
||||
|
||||
/* Get list of all backups sorted in order of descending start time */
|
||||
backups = catalog_get_backup_list(instance_name, INVALID_BACKUP_ID);
|
||||
backups = catalog_get_backup_list(instanceState->instance_name, INVALID_BACKUP_ID);
|
||||
|
||||
/* Find destination backup first */
|
||||
for (i = 0; i < parray_num(backups); i++)
|
||||
@@ -597,7 +597,7 @@ merge_chain(parray *parent_chain, pgBackup *full_backup, pgBackup *dest_backup)
|
||||
write_backup(backup, true);
|
||||
}
|
||||
else
|
||||
write_backup_status(backup, BACKUP_STATUS_MERGING, instance_name, true);
|
||||
write_backup_status(backup, BACKUP_STATUS_MERGING, true);
|
||||
}
|
||||
|
||||
/* Construct path to database dir: /backup_dir/instance_name/FULL/database */
|
||||
|
||||
+1
-1
@@ -385,7 +385,7 @@ validate_backup_wal_from_start_to_stop(pgBackup *backup,
|
||||
* If we don't have WAL between start_lsn and stop_lsn,
|
||||
* the backup is definitely corrupted. Update its status.
|
||||
*/
|
||||
write_backup_status(backup, BACKUP_STATUS_CORRUPT, instance_name, true);
|
||||
write_backup_status(backup, BACKUP_STATUS_CORRUPT, true);
|
||||
|
||||
elog(WARNING, "There are not enough WAL records to consistenly restore "
|
||||
"backup %s from START LSN: %X/%X to STOP LSN: %X/%X",
|
||||
|
||||
+9
-8
@@ -809,7 +809,7 @@ main(int argc, char *argv[])
|
||||
case ADD_INSTANCE_CMD:
|
||||
return do_add_instance(instanceState, &instance_config);
|
||||
case DELETE_INSTANCE_CMD:
|
||||
return do_delete_instance();
|
||||
return do_delete_instance(instanceState);
|
||||
case INIT_CMD:
|
||||
return do_init(catalogState);
|
||||
case BACKUP_CMD:
|
||||
@@ -821,10 +821,11 @@ main(int argc, char *argv[])
|
||||
elog(ERROR, "required parameter not specified: BACKUP_MODE "
|
||||
"(-b, --backup-mode)");
|
||||
|
||||
return do_backup(set_backup_params, no_validate, no_sync, backup_logs);
|
||||
return do_backup(instanceState, set_backup_params,
|
||||
no_validate, no_sync, backup_logs);
|
||||
}
|
||||
case RESTORE_CMD:
|
||||
return do_restore_or_validate(current.backup_id,
|
||||
return do_restore_or_validate(instanceState, current.backup_id,
|
||||
recovery_target_options,
|
||||
restore_params, no_sync);
|
||||
case VALIDATE_CMD:
|
||||
@@ -834,11 +835,11 @@ main(int argc, char *argv[])
|
||||
if (datname_exclude_list || datname_include_list)
|
||||
elog(ERROR, "You must specify parameter (-i, --backup-id) for partial validation");
|
||||
|
||||
return do_validate_all(backup_path);
|
||||
return do_validate_all(catalogState, instanceState);
|
||||
}
|
||||
else
|
||||
/* PITR validation and, optionally, partial validation */
|
||||
return do_restore_or_validate(current.backup_id,
|
||||
return do_restore_or_validate(instanceState, current.backup_id,
|
||||
recovery_target_options,
|
||||
restore_params,
|
||||
no_sync);
|
||||
@@ -859,13 +860,13 @@ main(int argc, char *argv[])
|
||||
if (delete_status)
|
||||
do_delete_status(&instance_config, delete_status);
|
||||
else
|
||||
do_retention();
|
||||
do_retention(instanceState);
|
||||
}
|
||||
else
|
||||
do_delete(current.backup_id);
|
||||
do_delete(instanceState, current.backup_id);
|
||||
break;
|
||||
case MERGE_CMD:
|
||||
do_merge(current.backup_id);
|
||||
do_merge(instanceState, current.backup_id);
|
||||
break;
|
||||
case SHOW_CONFIG_CMD:
|
||||
do_show_config();
|
||||
|
||||
+12
-8
@@ -49,6 +49,9 @@
|
||||
#include <pthread.h>
|
||||
#endif
|
||||
|
||||
/* Wrap the code that we're going to delete after refactoring in this define*/
|
||||
#define REFACTORE_ME
|
||||
|
||||
/* pgut client variables and full path */
|
||||
extern const char *PROGRAM_NAME;
|
||||
extern const char *PROGRAM_NAME_FULL;
|
||||
@@ -808,7 +811,7 @@ extern pgBackup current;
|
||||
extern char** commands_args;
|
||||
|
||||
/* in backup.c */
|
||||
extern int do_backup(pgSetBackupParams *set_backup_params,
|
||||
extern int do_backup(InstanceState *instanceState, pgSetBackupParams *set_backup_params,
|
||||
bool no_validate, bool no_sync, bool backup_logs);
|
||||
extern void do_checkdb(bool need_amcheck, ConnectionOptions conn_opt,
|
||||
char *pgdata);
|
||||
@@ -822,7 +825,8 @@ extern char *pg_ptrack_get_block(ConnectionArgs *arguments,
|
||||
BlockNumber blknum, size_t *result_size,
|
||||
int ptrack_version_num, const char *ptrack_schema);
|
||||
/* in restore.c */
|
||||
extern int do_restore_or_validate(time_t target_backup_id,
|
||||
extern int do_restore_or_validate(InstanceState *instanceState,
|
||||
time_t target_backup_id,
|
||||
pgRecoveryTarget *rt,
|
||||
pgRestoreParams *params,
|
||||
bool no_sync);
|
||||
@@ -843,7 +847,7 @@ extern parray *read_timeline_history(const char *arclog_path, TimeLineID targetT
|
||||
extern bool tliIsPartOfHistory(const parray *timelines, TimeLineID tli);
|
||||
|
||||
/* in merge.c */
|
||||
extern void do_merge(time_t backup_id);
|
||||
extern void do_merge(InstanceState *instanceState, time_t backup_id);
|
||||
extern void merge_backups(pgBackup *backup, pgBackup *next_backup);
|
||||
extern void merge_chain(parray *parent_chain,
|
||||
pgBackup *full_backup, pgBackup *dest_backup);
|
||||
@@ -872,10 +876,10 @@ extern int do_show(char *backup_catalog_path, const char *instance_name,
|
||||
time_t requested_backup_id, bool show_archive);
|
||||
|
||||
/* in delete.c */
|
||||
extern void do_delete(time_t backup_id);
|
||||
extern void do_delete(InstanceState *instanceState, time_t backup_id);
|
||||
extern void delete_backup_files(pgBackup *backup);
|
||||
extern void do_retention(void);
|
||||
extern int do_delete_instance(void);
|
||||
extern void do_retention(InstanceState *instanceState);
|
||||
extern int do_delete_instance(InstanceState *instanceState);
|
||||
extern void do_delete_status(InstanceConfig *instance_config, const char *status);
|
||||
|
||||
/* in fetch.c */
|
||||
@@ -893,7 +897,7 @@ extern void help_command(ProbackupSubcmd const subcmd);
|
||||
|
||||
/* in validate.c */
|
||||
extern void pgBackupValidate(pgBackup* backup, pgRestoreParams *params);
|
||||
extern int do_validate_all(char *backup_catalog_path);
|
||||
extern int do_validate_all(CatalogState *catalogState, InstanceState *instanceState);
|
||||
extern int validate_one_page(Page page, BlockNumber absolute_blkno,
|
||||
XLogRecPtr stop_lsn, PageState *page_st,
|
||||
uint32 checksum_version);
|
||||
@@ -912,7 +916,7 @@ extern bool validate_tablespace_map(pgBackup *backup);
|
||||
extern pgBackup *read_backup(const char *root_dir);
|
||||
extern void write_backup(pgBackup *backup, bool strict);
|
||||
extern void write_backup_status(pgBackup *backup, BackupStatus status,
|
||||
const char *instance_name, bool strict);
|
||||
bool strict);
|
||||
extern void write_backup_data_bytes(pgBackup *backup);
|
||||
extern bool lock_backup(pgBackup *backup, bool strict, bool exclusive);
|
||||
|
||||
|
||||
+5
-5
@@ -94,7 +94,7 @@ set_orphan_status(parray *backups, pgBackup *parent_backup)
|
||||
if (backup->status == BACKUP_STATUS_OK ||
|
||||
backup->status == BACKUP_STATUS_DONE)
|
||||
{
|
||||
write_backup_status(backup, BACKUP_STATUS_ORPHAN, instance_name, true);
|
||||
write_backup_status(backup, BACKUP_STATUS_ORPHAN, true);
|
||||
|
||||
elog(WARNING,
|
||||
"Backup %s is orphaned because his parent %s has status: %s",
|
||||
@@ -117,7 +117,7 @@ set_orphan_status(parray *backups, pgBackup *parent_backup)
|
||||
* Entry point of pg_probackup RESTORE and VALIDATE subcommands.
|
||||
*/
|
||||
int
|
||||
do_restore_or_validate(time_t target_backup_id, pgRecoveryTarget *rt,
|
||||
do_restore_or_validate(InstanceState *instanceState, time_t target_backup_id, pgRecoveryTarget *rt,
|
||||
pgRestoreParams *params, bool no_sync)
|
||||
{
|
||||
int i = 0;
|
||||
@@ -136,7 +136,7 @@ do_restore_or_validate(time_t target_backup_id, pgRecoveryTarget *rt,
|
||||
bool backup_has_tblspc = true; /* backup contain tablespace */
|
||||
XLogRecPtr shift_lsn = InvalidXLogRecPtr;
|
||||
|
||||
if (instance_name == NULL)
|
||||
if (instanceState == NULL)
|
||||
elog(ERROR, "required parameter not specified: --instance");
|
||||
|
||||
if (params->is_restore)
|
||||
@@ -216,7 +216,7 @@ do_restore_or_validate(time_t target_backup_id, pgRecoveryTarget *rt,
|
||||
elog(LOG, "%s begin.", action);
|
||||
|
||||
/* Get list of all backups sorted in order of descending start time */
|
||||
backups = catalog_get_backup_list(instance_name, INVALID_BACKUP_ID);
|
||||
backups = catalog_get_backup_list(instanceState->instance_name, INVALID_BACKUP_ID);
|
||||
|
||||
/* Find backup range we should restore or validate. */
|
||||
while ((i < parray_num(backups)) && !dest_backup)
|
||||
@@ -364,7 +364,7 @@ do_restore_or_validate(time_t target_backup_id, pgRecoveryTarget *rt,
|
||||
if (backup->status == BACKUP_STATUS_OK ||
|
||||
backup->status == BACKUP_STATUS_DONE)
|
||||
{
|
||||
write_backup_status(backup, BACKUP_STATUS_ORPHAN, instance_name, true);
|
||||
write_backup_status(backup, BACKUP_STATUS_ORPHAN, true);
|
||||
|
||||
elog(WARNING, "Backup %s is orphaned because his parent %s is missing",
|
||||
base36enc(backup->start_time), missing_backup_id);
|
||||
|
||||
+35
-23
@@ -16,7 +16,7 @@
|
||||
#include "utils/thread.h"
|
||||
|
||||
static void *pgBackupValidateFiles(void *arg);
|
||||
static void do_validate_instance(void);
|
||||
static void do_validate_instance(InstanceState *instanceState);
|
||||
|
||||
static bool corrupted_backup_found = false;
|
||||
static bool skipped_due_to_lock = false;
|
||||
@@ -75,7 +75,7 @@ pgBackupValidate(pgBackup *backup, pgRestoreParams *params)
|
||||
{
|
||||
elog(WARNING, "Backup %s has status %s, change it to ERROR and skip validation",
|
||||
base36enc(backup->start_time), status2str(backup->status));
|
||||
write_backup_status(backup, BACKUP_STATUS_ERROR, instance_name, true);
|
||||
write_backup_status(backup, BACKUP_STATUS_ERROR, true);
|
||||
corrupted_backup_found = true;
|
||||
return;
|
||||
}
|
||||
@@ -121,7 +121,7 @@ pgBackupValidate(pgBackup *backup, pgRestoreParams *params)
|
||||
{
|
||||
elog(WARNING, "Backup %s file list is corrupted", base36enc(backup->start_time));
|
||||
backup->status = BACKUP_STATUS_CORRUPT;
|
||||
write_backup_status(backup, BACKUP_STATUS_CORRUPT, instance_name, true);
|
||||
write_backup_status(backup, BACKUP_STATUS_CORRUPT, true);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -190,7 +190,7 @@ pgBackupValidate(pgBackup *backup, pgRestoreParams *params)
|
||||
backup->status = BACKUP_STATUS_CORRUPT;
|
||||
|
||||
write_backup_status(backup, corrupted ? BACKUP_STATUS_CORRUPT :
|
||||
BACKUP_STATUS_OK, instance_name, true);
|
||||
BACKUP_STATUS_OK, true);
|
||||
|
||||
if (corrupted)
|
||||
elog(WARNING, "Backup %s data files are corrupted", base36enc(backup->start_time));
|
||||
@@ -214,7 +214,7 @@ pgBackupValidate(pgBackup *backup, pgRestoreParams *params)
|
||||
"https://github.com/postgrespro/pg_probackup/issues/132",
|
||||
base36enc(backup->start_time));
|
||||
backup->status = BACKUP_STATUS_CORRUPT;
|
||||
write_backup_status(backup, BACKUP_STATUS_CORRUPT, instance_name, true);
|
||||
write_backup_status(backup, BACKUP_STATUS_CORRUPT, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -380,25 +380,25 @@ pgBackupValidateFiles(void *arg)
|
||||
/*
|
||||
* Validate all backups in the backup catalog.
|
||||
* If --instance option was provided, validate only backups of this instance.
|
||||
*
|
||||
* TODO: split into two functions: do_validate_catalog and do_validate_instance.
|
||||
*/
|
||||
int
|
||||
do_validate_all(char *backup_catalog_path)
|
||||
do_validate_all(CatalogState *catalogState, InstanceState *instanceState)
|
||||
{
|
||||
corrupted_backup_found = false;
|
||||
skipped_due_to_lock = false;
|
||||
|
||||
if (instance_name == NULL)
|
||||
if (instanceState == NULL)
|
||||
{
|
||||
/* Show list of instances */
|
||||
char path[MAXPGPATH];
|
||||
DIR *dir;
|
||||
struct dirent *dent;
|
||||
|
||||
/* open directory and list contents */
|
||||
join_path_components(path, backup_catalog_path, BACKUPS_DIR);
|
||||
dir = opendir(path);
|
||||
dir = opendir(catalogState->backup_subdir_path);
|
||||
if (dir == NULL)
|
||||
elog(ERROR, "cannot open directory \"%s\": %s", path, strerror(errno));
|
||||
elog(ERROR, "cannot open directory \"%s\": %s", catalogState->backup_subdir_path, strerror(errno));
|
||||
|
||||
errno = 0;
|
||||
while ((dent = readdir(dir)))
|
||||
@@ -406,13 +406,15 @@ do_validate_all(char *backup_catalog_path)
|
||||
char conf_path[MAXPGPATH];
|
||||
char child[MAXPGPATH];
|
||||
struct stat st;
|
||||
InstanceState *instance_state;
|
||||
|
||||
|
||||
/* skip entries point current dir or parent dir */
|
||||
if (strcmp(dent->d_name, ".") == 0 ||
|
||||
strcmp(dent->d_name, "..") == 0)
|
||||
continue;
|
||||
|
||||
join_path_components(child, path, dent->d_name);
|
||||
join_path_components(child, catalogState->backup_subdir_path, dent->d_name);
|
||||
|
||||
if (lstat(child, &st) == -1)
|
||||
elog(ERROR, "cannot stat file \"%s\": %s", child, strerror(errno));
|
||||
@@ -423,10 +425,20 @@ do_validate_all(char *backup_catalog_path)
|
||||
/*
|
||||
* Initialize instance configuration.
|
||||
*/
|
||||
instance_name = dent->d_name;
|
||||
instance_state = pgut_new(InstanceState);
|
||||
strncpy(instanceState->instance_name, dent->d_name, MAXPGPATH);
|
||||
|
||||
join_path_components(instanceState->instance_backup_subdir_path,
|
||||
catalogState->backup_subdir_path, instance_name);
|
||||
join_path_components(instanceState->instance_wal_subdir_path,
|
||||
catalogState->wal_subdir_path, instance_name);
|
||||
|
||||
#ifdef REFACTORE_ME
|
||||
sprintf(backup_instance_path, "%s/%s/%s",
|
||||
backup_catalog_path, BACKUPS_DIR, instance_name);
|
||||
sprintf(arclog_path, "%s/%s/%s", backup_catalog_path, "wal", instance_name);
|
||||
catalogState->catalog_path, BACKUPS_DIR, instanceState->instance_name);
|
||||
|
||||
sprintf(arclog_path, "%s/%s/%s", catalogState->catalog_path, "wal", instanceState->instance_name);
|
||||
#endif
|
||||
join_path_components(conf_path, backup_instance_path,
|
||||
BACKUP_CATALOG_CONF_FILE);
|
||||
if (config_read_opt(conf_path, instance_options, ERROR, false,
|
||||
@@ -437,12 +449,12 @@ do_validate_all(char *backup_catalog_path)
|
||||
continue;
|
||||
}
|
||||
|
||||
do_validate_instance();
|
||||
do_validate_instance(instanceState);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
do_validate_instance();
|
||||
do_validate_instance(instanceState);
|
||||
}
|
||||
|
||||
/* TODO: Probably we should have different exit code for every condition
|
||||
@@ -472,17 +484,17 @@ do_validate_all(char *backup_catalog_path)
|
||||
* Validate all backups in the given instance of the backup catalog.
|
||||
*/
|
||||
static void
|
||||
do_validate_instance(void)
|
||||
do_validate_instance(InstanceState *instanceState)
|
||||
{
|
||||
int i;
|
||||
int j;
|
||||
parray *backups;
|
||||
pgBackup *current_backup = NULL;
|
||||
|
||||
elog(INFO, "Validate backups of the instance '%s'", instance_name);
|
||||
elog(INFO, "Validate backups of the instance '%s'", instanceState->instance_name);
|
||||
|
||||
/* Get list of all backups sorted in order of descending start time */
|
||||
backups = catalog_get_backup_list(instance_name, INVALID_BACKUP_ID);
|
||||
backups = catalog_get_backup_list(instanceState->instance_name, INVALID_BACKUP_ID);
|
||||
|
||||
/* Examine backups one by one and validate them */
|
||||
for (i = 0; i < parray_num(backups); i++)
|
||||
@@ -512,7 +524,7 @@ do_validate_instance(void)
|
||||
if (current_backup->status == BACKUP_STATUS_OK ||
|
||||
current_backup->status == BACKUP_STATUS_DONE)
|
||||
{
|
||||
write_backup_status(current_backup, BACKUP_STATUS_ORPHAN, instance_name, true);
|
||||
write_backup_status(current_backup, BACKUP_STATUS_ORPHAN, true);
|
||||
elog(WARNING, "Backup %s is orphaned because his parent %s is missing",
|
||||
base36enc(current_backup->start_time),
|
||||
parent_backup_id);
|
||||
@@ -536,7 +548,7 @@ do_validate_instance(void)
|
||||
if (current_backup->status == BACKUP_STATUS_OK ||
|
||||
current_backup->status == BACKUP_STATUS_DONE)
|
||||
{
|
||||
write_backup_status(current_backup, BACKUP_STATUS_ORPHAN, instance_name, true);
|
||||
write_backup_status(current_backup, BACKUP_STATUS_ORPHAN, true);
|
||||
elog(WARNING, "Backup %s is orphaned because his parent %s has status: %s",
|
||||
base36enc(current_backup->start_time), backup_id,
|
||||
status2str(tmp_backup->status));
|
||||
@@ -609,7 +621,7 @@ do_validate_instance(void)
|
||||
if (backup->status == BACKUP_STATUS_OK ||
|
||||
backup->status == BACKUP_STATUS_DONE)
|
||||
{
|
||||
write_backup_status(backup, BACKUP_STATUS_ORPHAN, instance_name, true);
|
||||
write_backup_status(backup, BACKUP_STATUS_ORPHAN, true);
|
||||
|
||||
elog(WARNING, "Backup %s is orphaned because his parent %s has status: %s",
|
||||
base36enc(backup->start_time),
|
||||
|
||||
Reference in New Issue
Block a user