@@ -23,7 +23,7 @@ static pgBackup* get_closest_backup(timelineInfo *tlinfo);
23
23
static pgBackup * get_oldest_backup (timelineInfo * tlinfo );
24
24
static const char * backupModes [] = {"" , "PAGE" , "PTRACK" , "DELTA" , "FULL" };
25
25
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 );
27
27
28
28
static bool backup_lock_exit_hook_registered = false;
29
29
static parray * locks = NULL ;
@@ -1420,10 +1420,12 @@ get_multi_timeline_parent(parray *backup_list, parray *tli_list,
1420
1420
*/
1421
1421
1422
1422
void
1423
- pgBackupCreateDir (pgBackup * backup , const char * backup_instance_path )
1423
+ pgBackupCreateDir (pgBackup * backup , InstanceState * instanceState , time_t start_time )
1424
1424
{
1425
1425
int i ;
1426
1426
parray * subdirs = parray_new ();
1427
+ parray * backups ;
1428
+ pgBackup * target_backup ;
1427
1429
1428
1430
parray_append (subdirs , pg_strdup (DATABASE_DIR ));
1429
1431
@@ -1444,7 +1446,26 @@ pgBackupCreateDir(pgBackup *backup, const char *backup_instance_path)
1444
1446
free_dir_list (external_list );
1445
1447
}
1446
1448
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
+ }
1448
1469
1449
1470
if (backup -> backup_id == 0 )
1450
1471
elog (ERROR , "Cannot create backup directory: %s" , strerror (errno ));
@@ -1471,7 +1492,7 @@ pgBackupCreateDir(pgBackup *backup, const char *backup_instance_path)
1471
1492
* Create root directory for backup,
1472
1493
* update pgBackup.root_dir if directory creation was a success
1473
1494
*/
1474
- time_t
1495
+ void
1475
1496
create_backup_dir (pgBackup * backup , const char * backup_instance_path )
1476
1497
{
1477
1498
int attempts = 10 ;
@@ -1480,17 +1501,16 @@ create_backup_dir(pgBackup *backup, const char *backup_instance_path)
1480
1501
{
1481
1502
int rc ;
1482
1503
char path [MAXPGPATH ];
1483
- time_t backup_id = time (NULL );
1484
1504
1485
- join_path_components (path , backup_instance_path , base36enc (backup_id ));
1505
+ join_path_components (path , backup_instance_path , base36enc (backup -> backup_id ));
1486
1506
1487
1507
/* TODO: add wrapper for remote mode */
1488
1508
rc = dir_create_dir (path , DIR_PERMISSION , true);
1489
1509
1490
1510
if (rc == 0 )
1491
1511
{
1492
1512
backup -> root_dir = pgut_strdup (path );
1493
- return backup_id ;
1513
+ return ;
1494
1514
}
1495
1515
else
1496
1516
{
@@ -1499,7 +1519,6 @@ create_backup_dir(pgBackup *backup, const char *backup_instance_path)
1499
1519
}
1500
1520
}
1501
1521
1502
- return 0 ;
1503
1522
}
1504
1523
1505
1524
/*
0 commit comments