Skip to content

Commit 5f2283c

Browse files
committed
Add backup start time as parameter for do_backup
1 parent 0b5b37e commit 5f2283c

File tree

4 files changed

+35
-13
lines changed

4 files changed

+35
-13
lines changed

src/backup.c

Lines changed: 2 additions & 2 deletions
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

Lines changed: 27 additions & 8 deletions
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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -939,6 +939,9 @@ main(int argc, char *argv[])
939939
return do_init(catalogState);
940940
case BACKUP_CMD:
941941
{
942+
time_t start_time;
943+
time(&start_time);
944+
942945
current.stream = stream_wal;
943946

944947
/* sanity */
@@ -947,7 +950,7 @@ main(int argc, char *argv[])
947950
"(-b, --backup-mode)");
948951

949952
return do_backup(instanceState, set_backup_params,
950-
no_validate, no_sync, backup_logs);
953+
no_validate, no_sync, backup_logs, start_time);
951954
}
952955
case CATCHUP_CMD:
953956
return do_catchup(catchup_source_pgdata, catchup_destination_pgdata, num_threads, !no_sync,

src/pg_probackup.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,7 @@ extern char** commands_args;
840840

841841
/* in backup.c */
842842
extern int do_backup(InstanceState *instanceState, pgSetBackupParams *set_backup_params,
843-
bool no_validate, bool no_sync, bool backup_logs);
843+
bool no_validate, bool no_sync, bool backup_logs, time_t start_time);
844844
extern void do_checkdb(bool need_amcheck, ConnectionOptions conn_opt,
845845
char *pgdata);
846846
extern BackupMode parse_backup_mode(const char *value);
@@ -981,7 +981,7 @@ extern void write_backup_filelist(pgBackup *backup, parray *files,
981981
const char *root, parray *external_list, bool sync);
982982

983983

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

0 commit comments

Comments
 (0)