1313#include <unistd.h>
1414
1515static int pgBackupDeleteFiles (pgBackup * backup );
16+ int do_deletewal (time_t backup_id ,bool strict );
1617
1718int
1819do_delete (time_t backup_id )
@@ -21,8 +22,6 @@ do_delete(time_t backup_id)
2122int b_index ;
2223int ret ;
2324parray * backup_list ;
24- XLogRecPtr oldest_lsn = InvalidXLogRecPtr ;
25- TimeLineID oldest_tli ;
2625pgBackup * last_backup ;
2726
2827/* DATE are always required */
@@ -82,37 +81,58 @@ do_delete(time_t backup_id)
8281/* cleanup */
8382parray_walk (backup_list ,pgBackupFree );
8483parray_free (backup_list );
84+
85+ if (delete_wal )
86+ do_deletewal (backup_id , false);
87+
88+ return 0 ;
89+ }
90+
91+ int do_deletewal (time_t backup_id ,bool strict )
92+ {
93+ int i ;
94+ int ret ;
95+ parray * backup_list ;
96+ XLogRecPtr oldest_lsn = InvalidXLogRecPtr ;
97+ TimeLineID oldest_tli ;
98+ pgBackup * last_backup ;
99+ bool backup_found = false;
100+
85101/*
86102 * Delete in archive WAL segments that are not needed anymore. The oldest
87103 * segment to be kept is the first segment that the oldest full backup
88104 * found around needs to keep.
89105 */
90- if (delete_wal )
106+ /* Lock backup catalog */
107+ ret = catalog_lock ();
108+ if (ret == -1 )
109+ elog (ERROR ,"can't lock backup catalog." );
110+ else if (ret == 1 )
111+ elog (ERROR ,
112+ "another pg_arman is running, stop delete." );
113+
114+ backup_list = catalog_get_backup_list (0 );
115+ for (i = 0 ;i < parray_num (backup_list );i ++ )
91116{
92- /* Lock backup catalog */
93- ret = catalog_lock ();
94- if (ret == -1 )
95- elog (ERROR ,"can't lock backup catalog." );
96- else if (ret == 1 )
97- elog (ERROR ,
98- "another pg_arman is running, stop delete." );
99-
100- backup_list = catalog_get_backup_list (0 );
101- for (i = 0 ;i < parray_num (backup_list );i ++ )
117+ last_backup = (pgBackup * )parray_get (backup_list ,i );
118+ if (last_backup -> status == BACKUP_STATUS_OK )
102119{
103- last_backup = (pgBackup * )parray_get (backup_list ,i );
104- if (last_backup -> status == BACKUP_STATUS_OK )
120+ oldest_lsn = last_backup -> start_lsn ;
121+ oldest_tli = last_backup -> tli ;
122+ if (strict && backup_id != 0 && backup_id >=last_backup -> start_time )
105123{
106- oldest_lsn = last_backup -> start_lsn ;
107- oldest_tli = last_backup -> tli ;
124+ backup_found = true ;
125+ break ;
108126}
109127}
110- catalog_unlock ();
111- parray_walk (backup_list ,pgBackupFree );
112- parray_free (backup_list );
113128}
129+ if (strict && backup_id != 0 && backup_found == false)
130+ elog (ERROR ,"not found backup for deletwal command" );
131+ catalog_unlock ();
132+ parray_walk (backup_list ,pgBackupFree );
133+ parray_free (backup_list );
114134
115- if (delete_wal && !XLogRecPtrIsInvalid (oldest_lsn ))
135+ if (!XLogRecPtrIsInvalid (oldest_lsn ))
116136{
117137XLogSegNo targetSegNo ;
118138char oldestSegmentNeeded [MAXFNAMELEN ];