You've already forked pg_probackup
mirror of
https://github.com/postgrespro/pg_probackup.git
synced 2025-07-14 06:54:15 +02:00
[Issue #146] Refactoring
This commit is contained in:
12
src/backup.c
12
src/backup.c
@ -156,7 +156,6 @@ do_backup_instance(PGconn *backup_conn, PGNodeInfo *nodeInfo, bool no_sync)
|
|||||||
/* used for multitimeline incremental backup */
|
/* used for multitimeline incremental backup */
|
||||||
parray *tli_list = NULL;
|
parray *tli_list = NULL;
|
||||||
|
|
||||||
|
|
||||||
/* for fancy reporting */
|
/* for fancy reporting */
|
||||||
time_t start_time, end_time;
|
time_t start_time, end_time;
|
||||||
char pretty_time[20];
|
char pretty_time[20];
|
||||||
@ -820,9 +819,7 @@ do_backup(time_t start_time, bool no_validate,
|
|||||||
/* Update backup status and other metainfo. */
|
/* Update backup status and other metainfo. */
|
||||||
current.status = BACKUP_STATUS_RUNNING;
|
current.status = BACKUP_STATUS_RUNNING;
|
||||||
current.start_time = start_time;
|
current.start_time = start_time;
|
||||||
|
|
||||||
current.note = set_backup_params ? set_backup_params->note : NULL;
|
|
||||||
|
|
||||||
StrNCpy(current.program_version, PROGRAM_VERSION,
|
StrNCpy(current.program_version, PROGRAM_VERSION,
|
||||||
sizeof(current.program_version));
|
sizeof(current.program_version));
|
||||||
|
|
||||||
@ -905,6 +902,10 @@ do_backup(time_t start_time, bool no_validate,
|
|||||||
if (instance_config.master_conn_opt.pghost == NULL)
|
if (instance_config.master_conn_opt.pghost == NULL)
|
||||||
elog(ERROR, "Options for connection to master must be provided to perform backup from replica");
|
elog(ERROR, "Options for connection to master must be provided to perform backup from replica");
|
||||||
|
|
||||||
|
/* add note to backup if requested */
|
||||||
|
if (set_backup_params && set_backup_params->note)
|
||||||
|
add_note(¤t, set_backup_params->note);
|
||||||
|
|
||||||
/* backup data */
|
/* backup data */
|
||||||
do_backup_instance(backup_conn, &nodeInfo, no_sync);
|
do_backup_instance(backup_conn, &nodeInfo, no_sync);
|
||||||
pgut_atexit_pop(backup_cleanup, NULL);
|
pgut_atexit_pop(backup_cleanup, NULL);
|
||||||
@ -937,8 +938,7 @@ do_backup(time_t start_time, bool no_validate,
|
|||||||
(set_backup_params->ttl > 0 ||
|
(set_backup_params->ttl > 0 ||
|
||||||
set_backup_params->expire_time > 0))
|
set_backup_params->expire_time > 0))
|
||||||
{
|
{
|
||||||
if (!pin_backup(¤t, set_backup_params))
|
pin_backup(¤t, set_backup_params);
|
||||||
elog(ERROR, "Failed to pin the backup %s", base36enc(current.backup_id));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!no_validate)
|
if (!no_validate)
|
||||||
|
@ -1534,18 +1534,23 @@ do_set_backup(const char *instance_name, time_t backup_id,
|
|||||||
|
|
||||||
target_backup = (pgBackup *) parray_get(backup_list, 0);
|
target_backup = (pgBackup *) parray_get(backup_list, 0);
|
||||||
|
|
||||||
if (!pin_backup(target_backup, set_backup_params))
|
/* Pin or unpin backup if requested */
|
||||||
elog(ERROR, "Failed to pin the backup %s", base36enc(backup_id));
|
if (set_backup_params->ttl >= 0 || set_backup_params->expire_time > 0)
|
||||||
|
pin_backup(target_backup, set_backup_params);
|
||||||
|
|
||||||
|
if (set_backup_params->note)
|
||||||
|
add_note(target_backup, set_backup_params->note);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set 'expire-time' attribute based on set_backup_params, or unpin backup
|
* Set 'expire-time' attribute based on set_backup_params, or unpin backup
|
||||||
* if ttl is equal to zero.
|
* if ttl is equal to zero.
|
||||||
*/
|
*/
|
||||||
bool
|
void
|
||||||
pin_backup(pgBackup *target_backup, pgSetBackupParams *set_backup_params)
|
pin_backup(pgBackup *target_backup, pgSetBackupParams *set_backup_params)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/* sanity, backup must have positive recovery-time */
|
||||||
if (target_backup->recovery_time <= 0)
|
if (target_backup->recovery_time <= 0)
|
||||||
elog(ERROR, "Failed to set 'expire-time' for backup %s: invalid 'recovery-time'",
|
elog(ERROR, "Failed to set 'expire-time' for backup %s: invalid 'recovery-time'",
|
||||||
base36enc(target_backup->backup_id));
|
base36enc(target_backup->backup_id));
|
||||||
@ -1563,17 +1568,16 @@ pin_backup(pgBackup *target_backup, pgSetBackupParams *set_backup_params)
|
|||||||
{
|
{
|
||||||
elog(WARNING, "Backup %s is not pinned, nothing to unpin",
|
elog(WARNING, "Backup %s is not pinned, nothing to unpin",
|
||||||
base36enc(target_backup->start_time));
|
base36enc(target_backup->start_time));
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
target_backup->expire_time = 0;
|
target_backup->expire_time = 0;
|
||||||
}
|
}
|
||||||
/* Pin comes from expire-time */
|
/* Pin comes from expire-time */
|
||||||
else if (set_backup_params->expire_time > 0)
|
else if (set_backup_params->expire_time > 0)
|
||||||
target_backup->expire_time = set_backup_params->expire_time;
|
target_backup->expire_time = set_backup_params->expire_time;
|
||||||
else if (!set_backup_params->note)
|
else
|
||||||
return false;
|
/* nothing to do */
|
||||||
|
return;
|
||||||
if (set_backup_params->note) target_backup->note = set_backup_params->note;
|
|
||||||
|
|
||||||
/* Update backup.control */
|
/* Update backup.control */
|
||||||
write_backup(target_backup);
|
write_backup(target_backup);
|
||||||
@ -1586,12 +1590,47 @@ pin_backup(pgBackup *target_backup, pgSetBackupParams *set_backup_params)
|
|||||||
elog(INFO, "Backup %s is pinned until '%s'", base36enc(target_backup->start_time),
|
elog(INFO, "Backup %s is pinned until '%s'", base36enc(target_backup->start_time),
|
||||||
expire_timestamp);
|
expire_timestamp);
|
||||||
}
|
}
|
||||||
else if (set_backup_params->ttl == 0)
|
else
|
||||||
elog(INFO, "Backup %s is unpinned", base36enc(target_backup->start_time));
|
elog(INFO, "Backup %s is unpinned", base36enc(target_backup->start_time));
|
||||||
|
|
||||||
if (set_backup_params->note)
|
return;
|
||||||
elog(INFO, "Saved note for backup %s", base36enc(target_backup->start_time));
|
}
|
||||||
return true;
|
|
||||||
|
/*
|
||||||
|
* Add note to backup metadata or unset already existing note.
|
||||||
|
* It is a job of the caller to make sure that note is not NULL.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
add_note(pgBackup *target_backup, char *note)
|
||||||
|
{
|
||||||
|
|
||||||
|
char *note_string;
|
||||||
|
|
||||||
|
/* unset note */
|
||||||
|
if (pg_strcasecmp(note, "none") == 0)
|
||||||
|
{
|
||||||
|
target_backup->note = NULL;
|
||||||
|
elog(INFO, "Removing note from backup %s",
|
||||||
|
base36enc(target_backup->start_time));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Currently we do not allow string with newlines as note,
|
||||||
|
* because it will break parsing of backup.control.
|
||||||
|
* So if user provides string like this "aaa\nbbbbb",
|
||||||
|
* we save only "aaa"
|
||||||
|
* Example: tests.set_backup.SetBackupTest.test_add_note_newlines
|
||||||
|
*/
|
||||||
|
note_string = pgut_malloc(MAX_NOTE_SIZE);
|
||||||
|
sscanf(note, "%[^\n]", note_string);
|
||||||
|
|
||||||
|
target_backup->note = note_string;
|
||||||
|
elog(INFO, "Adding note to backup %s: '%s'",
|
||||||
|
base36enc(target_backup->start_time), target_backup->note);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update backup.control */
|
||||||
|
write_backup(target_backup);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1688,7 +1727,7 @@ pgBackupWriteControl(FILE *out, pgBackup *backup)
|
|||||||
fio_fprintf(out, "external-dirs = '%s'\n", backup->external_dir_str);
|
fio_fprintf(out, "external-dirs = '%s'\n", backup->external_dir_str);
|
||||||
|
|
||||||
if (backup->note)
|
if (backup->note)
|
||||||
fio_fprintf(out, "note = %s\n", backup->note);
|
fio_fprintf(out, "note = '%s'\n", backup->note);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,10 +75,10 @@ char *replication_slot = NULL;
|
|||||||
bool temp_slot = false;
|
bool temp_slot = false;
|
||||||
|
|
||||||
/* backup options */
|
/* backup options */
|
||||||
bool backup_logs = false;
|
bool backup_logs = false;
|
||||||
bool smooth_checkpoint;
|
bool smooth_checkpoint;
|
||||||
char *remote_agent;
|
char *remote_agent;
|
||||||
static char *backup_note = NULL;
|
static char *backup_note = NULL;
|
||||||
/* restore options */
|
/* restore options */
|
||||||
static char *target_time = NULL;
|
static char *target_time = NULL;
|
||||||
static char *target_xid = NULL;
|
static char *target_xid = NULL;
|
||||||
@ -183,7 +183,7 @@ static ConfigOption cmd_options[] =
|
|||||||
{ 'b', 183, "delete-expired", &delete_expired, SOURCE_CMD_STRICT },
|
{ 'b', 183, "delete-expired", &delete_expired, SOURCE_CMD_STRICT },
|
||||||
{ 'b', 184, "merge-expired", &merge_expired, SOURCE_CMD_STRICT },
|
{ 'b', 184, "merge-expired", &merge_expired, SOURCE_CMD_STRICT },
|
||||||
{ 'b', 185, "dry-run", &dry_run, SOURCE_CMD_STRICT },
|
{ 'b', 185, "dry-run", &dry_run, SOURCE_CMD_STRICT },
|
||||||
{ 's', 238, "note", &backup_note, SOURCE_CMD_STRICT },
|
{ 's', 238, "note", &backup_note, SOURCE_CMD_STRICT },
|
||||||
/* restore options */
|
/* restore options */
|
||||||
{ 's', 136, "recovery-target-time", &target_time, SOURCE_CMD_STRICT },
|
{ 's', 136, "recovery-target-time", &target_time, SOURCE_CMD_STRICT },
|
||||||
{ 's', 137, "recovery-target-xid", &target_xid, SOURCE_CMD_STRICT },
|
{ 's', 137, "recovery-target-xid", &target_xid, SOURCE_CMD_STRICT },
|
||||||
@ -753,6 +753,9 @@ main(int argc, char *argv[])
|
|||||||
set_backup_params->ttl = ttl;
|
set_backup_params->ttl = ttl;
|
||||||
set_backup_params->expire_time = expire_time;
|
set_backup_params->expire_time = expire_time;
|
||||||
set_backup_params->note = backup_note;
|
set_backup_params->note = backup_note;
|
||||||
|
|
||||||
|
if (backup_note && strlen(backup_note) > MAX_NOTE_SIZE)
|
||||||
|
elog(ERROR, "Backup note cannot exceed %u bytes", MAX_NOTE_SIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,6 +90,8 @@ extern const char *PROGRAM_EMAIL;
|
|||||||
/* retry attempts */
|
/* retry attempts */
|
||||||
#define PAGE_READ_ATTEMPTS 100
|
#define PAGE_READ_ATTEMPTS 100
|
||||||
|
|
||||||
|
#define MAX_NOTE_SIZE 1024
|
||||||
|
|
||||||
/* Check if an XLogRecPtr value is pointed to 0 offset */
|
/* Check if an XLogRecPtr value is pointed to 0 offset */
|
||||||
#define XRecOffIsNull(xlrp) \
|
#define XRecOffIsNull(xlrp) \
|
||||||
((xlrp) % XLOG_BLCKSZ == 0)
|
((xlrp) % XLOG_BLCKSZ == 0)
|
||||||
@ -391,7 +393,6 @@ struct pgBackup
|
|||||||
parray *files; /* list of files belonging to this backup
|
parray *files; /* list of files belonging to this backup
|
||||||
* must be populated explicitly */
|
* must be populated explicitly */
|
||||||
char *note;
|
char *note;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Recovery target for restore and validate subcommands */
|
/* Recovery target for restore and validate subcommands */
|
||||||
@ -435,14 +436,14 @@ typedef struct pgRestoreParams
|
|||||||
/* Options needed for set-backup command */
|
/* Options needed for set-backup command */
|
||||||
typedef struct pgSetBackupParams
|
typedef struct pgSetBackupParams
|
||||||
{
|
{
|
||||||
int64 ttl; /* amount of time backup must be pinned
|
int64 ttl; /* amount of time backup must be pinned
|
||||||
* -1 - do nothing
|
* -1 - do nothing
|
||||||
* 0 - disable pinning
|
* 0 - disable pinning
|
||||||
*/
|
*/
|
||||||
time_t expire_time; /* Point in time before which backup
|
time_t expire_time; /* Point in time until backup
|
||||||
* must be pinned.
|
* must be pinned.
|
||||||
*/
|
*/
|
||||||
char *note;
|
char *note;
|
||||||
} pgSetBackupParams;
|
} pgSetBackupParams;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -781,8 +782,9 @@ extern void timelineInfoFree(void *tliInfo);
|
|||||||
extern parray *catalog_get_timelines(InstanceConfig *instance);
|
extern parray *catalog_get_timelines(InstanceConfig *instance);
|
||||||
extern void do_set_backup(const char *instance_name, time_t backup_id,
|
extern void do_set_backup(const char *instance_name, time_t backup_id,
|
||||||
pgSetBackupParams *set_backup_params);
|
pgSetBackupParams *set_backup_params);
|
||||||
extern bool pin_backup(pgBackup *target_backup,
|
extern void pin_backup(pgBackup *target_backup,
|
||||||
pgSetBackupParams *set_backup_params);
|
pgSetBackupParams *set_backup_params);
|
||||||
|
extern void add_note(pgBackup *target_backup, char *note);
|
||||||
extern void pgBackupWriteControl(FILE *out, pgBackup *backup);
|
extern void pgBackupWriteControl(FILE *out, pgBackup *backup);
|
||||||
extern void write_backup_filelist(pgBackup *backup, parray *files,
|
extern void write_backup_filelist(pgBackup *backup, parray *files,
|
||||||
const char *root, parray *external_list);
|
const char *root, parray *external_list);
|
||||||
|
Reference in New Issue
Block a user