Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2bc096b

Browse files
authored
Merge pull request #515 from postgrespro/PBCKP-170
PBCKP-170
2 parents 2e1950a + 8ce27c9 commit 2bc096b

File tree

6 files changed

+415
-15
lines changed

6 files changed

+415
-15
lines changed

src/backup.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,7 @@ pgdata_basic_setup(ConnectionOptions conn_opt, PGNodeInfo *nodeInfo)
695695
*/
696696
int
697697
do_backup(InstanceState *instanceState, pgSetBackupParams *set_backup_params,
698-
bool no_validate, bool no_sync, bool backup_logs)
698+
bool no_validate, bool no_sync, bool backup_logs, time_t start_time)
699699
{
700700
PGconn *backup_conn = NULL;
701701
PGNodeInfo nodeInfo;
@@ -710,7 +710,7 @@ do_backup(InstanceState *instanceState, pgSetBackupParams *set_backup_params,
710710
current.external_dir_str = instance_config.external_dir_str;
711711

712712
/* Create backup directory and BACKUP_CONTROL_FILE */
713-
pgBackupCreateDir(&current, instanceState->instance_backup_subdir_path);
713+
pgBackupCreateDir(&current, instanceState, start_time);
714714

715715
if (!instance_config.pgdata)
716716
elog(ERROR, "required parameter not specified: PGDATA "

src/catalog.c

+27-8
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ static pgBackup* get_closest_backup(timelineInfo *tlinfo);
2323
static pgBackup* get_oldest_backup(timelineInfo *tlinfo);
2424
static const char *backupModes[] = {"", "PAGE", "PTRACK", "DELTA", "FULL"};
2525
static pgBackup *readBackupControlFile(const char *path);
26-
static time_t create_backup_dir(pgBackup *backup, const char *backup_instance_path);
26+
static void create_backup_dir(pgBackup *backup, const char *backup_instance_path);
2727

2828
static bool backup_lock_exit_hook_registered = false;
2929
static parray *locks = NULL;
@@ -1420,10 +1420,12 @@ get_multi_timeline_parent(parray *backup_list, parray *tli_list,
14201420
*/
14211421

14221422
void
1423-
pgBackupCreateDir(pgBackup *backup, const char *backup_instance_path)
1423+
pgBackupCreateDir(pgBackup *backup, InstanceState *instanceState, time_t start_time)
14241424
{
14251425
int i;
14261426
parray *subdirs = parray_new();
1427+
parray * backups;
1428+
pgBackup *target_backup;
14271429

14281430
parray_append(subdirs, pg_strdup(DATABASE_DIR));
14291431

@@ -1444,7 +1446,26 @@ pgBackupCreateDir(pgBackup *backup, const char *backup_instance_path)
14441446
free_dir_list(external_list);
14451447
}
14461448

1447-
backup->backup_id = create_backup_dir(backup, backup_instance_path);
1449+
/* Get list of all backups*/
1450+
backups = catalog_get_backup_list(instanceState, INVALID_BACKUP_ID);
1451+
if (parray_num(backups) > 0)
1452+
{
1453+
target_backup = (pgBackup *) parray_get(backups, 0);
1454+
if (start_time > target_backup->backup_id)
1455+
{
1456+
backup->backup_id = start_time;
1457+
create_backup_dir(backup, instanceState->instance_backup_subdir_path);
1458+
}
1459+
else
1460+
{
1461+
elog(ERROR, "Cannot create directory for older backup");
1462+
}
1463+
}
1464+
else
1465+
{
1466+
backup->backup_id = start_time;
1467+
create_backup_dir(backup, instanceState->instance_backup_subdir_path);
1468+
}
14481469

14491470
if (backup->backup_id == 0)
14501471
elog(ERROR, "Cannot create backup directory: %s", strerror(errno));
@@ -1471,7 +1492,7 @@ pgBackupCreateDir(pgBackup *backup, const char *backup_instance_path)
14711492
* Create root directory for backup,
14721493
* update pgBackup.root_dir if directory creation was a success
14731494
*/
1474-
time_t
1495+
void
14751496
create_backup_dir(pgBackup *backup, const char *backup_instance_path)
14761497
{
14771498
int attempts = 10;
@@ -1480,17 +1501,16 @@ create_backup_dir(pgBackup *backup, const char *backup_instance_path)
14801501
{
14811502
int rc;
14821503
char path[MAXPGPATH];
1483-
time_t backup_id = time(NULL);
14841504

1485-
join_path_components(path, backup_instance_path, base36enc(backup_id));
1505+
join_path_components(path, backup_instance_path, base36enc(backup->backup_id));
14861506

14871507
/* TODO: add wrapper for remote mode */
14881508
rc = dir_create_dir(path, DIR_PERMISSION, true);
14891509

14901510
if (rc == 0)
14911511
{
14921512
backup->root_dir = pgut_strdup(path);
1493-
return backup_id;
1513+
return;
14941514
}
14951515
else
14961516
{
@@ -1499,7 +1519,6 @@ create_backup_dir(pgBackup *backup, const char *backup_instance_path)
14991519
}
15001520
}
15011521

1502-
return 0;
15031522
}
15041523

15051524
/*

src/pg_probackup.c

+10-1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ pid_t my_pid = 0;
7878
__thread int my_thread_num = 1;
7979
bool progress = false;
8080
bool no_sync = false;
81+
time_t start_time = 0;
8182
#if PG_VERSION_NUM >= 100000
8283
char *replication_slot = NULL;
8384
bool temp_slot = false;
@@ -201,6 +202,7 @@ static ConfigOption cmd_options[] =
201202
{ 's', 'i', "backup-id", &backup_id_string, SOURCE_CMD_STRICT },
202203
{ 'b', 133, "no-sync", &no_sync, SOURCE_CMD_STRICT },
203204
{ 'b', 134, "no-color", &no_color, SOURCE_CMD_STRICT },
205+
{ 'U', 241, "start-time", &start_time, SOURCE_CMD_STRICT },
204206
/* backup options */
205207
{ 'b', 180, "backup-pg-log", &backup_logs, SOURCE_CMD_STRICT },
206208
{ 'f', 'b', "backup-mode", opt_backup_mode, SOURCE_CMD_STRICT },
@@ -957,14 +959,21 @@ main(int argc, char *argv[])
957959
case BACKUP_CMD:
958960
{
959961
current.stream = stream_wal;
962+
if (start_time == 0)
963+
start_time = current_time;
964+
else
965+
elog(WARNING, "Please do not use the --start-time option to start backup. "
966+
"This is a service option required to work with other extensions. "
967+
"We do not guarantee future support for this flag.");
968+
960969

961970
/* sanity */
962971
if (current.backup_mode == BACKUP_MODE_INVALID)
963972
elog(ERROR, "required parameter not specified: BACKUP_MODE "
964973
"(-b, --backup-mode)");
965974

966975
return do_backup(instanceState, set_backup_params,
967-
no_validate, no_sync, backup_logs);
976+
no_validate, no_sync, backup_logs, start_time);
968977
}
969978
case CATCHUP_CMD:
970979
return do_catchup(catchup_source_pgdata, catchup_destination_pgdata, num_threads, !no_sync,

src/pg_probackup.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -842,7 +842,7 @@ extern char** commands_args;
842842

843843
/* in backup.c */
844844
extern int do_backup(InstanceState *instanceState, pgSetBackupParams *set_backup_params,
845-
bool no_validate, bool no_sync, bool backup_logs);
845+
bool no_validate, bool no_sync, bool backup_logs, time_t start_time);
846846
extern void do_checkdb(bool need_amcheck, ConnectionOptions conn_opt,
847847
char *pgdata);
848848
extern BackupMode parse_backup_mode(const char *value);
@@ -983,7 +983,7 @@ extern void write_backup_filelist(pgBackup *backup, parray *files,
983983
const char *root, parray *external_list, bool sync);
984984

985985

986-
extern void pgBackupCreateDir(pgBackup *backup, const char *backup_instance_path);
986+
extern void pgBackupCreateDir(pgBackup *backup, InstanceState *instanceState, time_t start_time);
987987
extern void pgNodeInit(PGNodeInfo *node);
988988
extern void pgBackupInit(pgBackup *backup);
989989
extern void pgBackupFree(void *backup);

0 commit comments

Comments
 (0)