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

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: 10 additions & 1 deletion
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

Lines changed: 2 additions & 2 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy