Refactoring. Use instanceState instead of global variable instance_name

This commit is contained in:
anastasia
2021-02-03 18:39:51 +03:00
parent cc58553514
commit dbf523308b
10 changed files with 83 additions and 66 deletions
+7 -7
View File
@@ -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(&current, backup_instance_path);
pgBackupCreateDir(&current, 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(&current, false),
PROGRAM_VERSION, instanceState->instance_name, base36enc(current.backup_id), pgBackupGetBackupMode(&current, 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(&current, 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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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),