@@ -23,7 +23,7 @@ static pgBackup* get_closest_backup(timelineInfo *tlinfo);
2323static pgBackup * get_oldest_backup (timelineInfo * tlinfo );
2424static const char * backupModes [] = {"" , "PAGE" , "PTRACK" , "DELTA" , "FULL" };
2525static 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
2828static bool backup_lock_exit_hook_registered = false;
2929static parray * locks = NULL ;
@@ -1420,10 +1420,12 @@ get_multi_timeline_parent(parray *backup_list, parray *tli_list,
14201420 */
14211421
14221422void
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
14751496create_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/*
0 commit comments