1818do_delete (time_t backup_id )
1919{
2020int i ;
21+ int b_index ;
2122int ret ;
2223parray * backup_list ;
23- bool do_delete = false;
2424XLogRecPtr oldest_lsn = InvalidXLogRecPtr ;
2525TimeLineID oldest_tli ;
26+ pgBackup * last_backup ;
2627
2728/* DATE are always required */
2829if (backup_id == 0 )
@@ -41,31 +42,38 @@ do_delete(time_t backup_id)
4142if (!backup_list )
4243elog (ERROR ,"No backup list found, can't process any more." );
4344
44- /* Findbackups to be deleted */
45+ /* Findbackup to be deleted */
4546for (i = 0 ;i < parray_num (backup_list );i ++ )
4647{
47- pgBackup * backup = (pgBackup * )parray_get (backup_list ,i );
48+ last_backup = (pgBackup * )parray_get (backup_list ,i );
49+ if (last_backup -> status == BACKUP_STATUS_OK &&
50+ last_backup -> start_time == backup_id
51+ )
52+ gotofound_backup ;
53+ }
4854
49- /* delete backup and update status to DELETED */
50- if (do_delete )
51- {
52- /* check for interrupt */
53- if (interrupted )
54- elog (ERROR ,"interrupted during delete backup" );
55+ elog (ERROR ,"no backup found, cannot delete." );
5556
56- pgBackupDeleteFiles (backup );
57- continue ;
58- }
57+ found_backup :
58+ b_index = i ;
59+ /* check for interrupt */
60+ if (interrupted )
61+ elog (ERROR ,"interrupted during delete backup" );
5962
60- /* Found the latest full backup */
61- if (backup -> backup_mode >=BACKUP_MODE_FULL &&
62- backup -> status == BACKUP_STATUS_OK &&
63- backup -> start_time <=backup_id )
64- {
65- do_delete = true;
66- oldest_lsn = backup -> start_lsn ;
67- oldest_tli = backup -> tli ;
68- }
63+ /* just do it */
64+ pgBackupDeleteFiles (last_backup );
65+
66+ /* remove all increments after removed backup */
67+ for (i = b_index - 1 ;i >=0 ;i -- )
68+ {
69+ pgBackup * backup = (pgBackup * )parray_get (backup_list ,i );
70+ if (backup -> backup_mode >=BACKUP_MODE_FULL )
71+ break ;
72+ if (backup -> status == BACKUP_STATUS_OK ||
73+ backup -> backup_mode == BACKUP_MODE_DIFF_PAGE ||
74+ backup -> backup_mode == BACKUP_MODE_DIFF_PTRACK
75+ )
76+ pgBackupDeleteFiles (backup );
6977}
7078
7179/* release catalog lock */
@@ -74,13 +82,37 @@ do_delete(time_t backup_id)
7482/* cleanup */
7583parray_walk (backup_list ,pgBackupFree );
7684parray_free (backup_list );
77-
7885/*
7986 * Delete in archive WAL segments that are not needed anymore. The oldest
8087 * segment to be kept is the first segment that the oldest full backup
8188 * found around needs to keep.
8289 */
83- if (!XLogRecPtrIsInvalid (oldest_lsn ))
90+ if (delete_wal )
91+ {
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 ++ )
102+ {
103+ last_backup = (pgBackup * )parray_get (backup_list ,i );
104+ if (last_backup -> status == BACKUP_STATUS_OK )
105+ {
106+ oldest_lsn = last_backup -> start_lsn ;
107+ oldest_tli = last_backup -> tli ;
108+ }
109+ }
110+ catalog_unlock ();
111+ parray_walk (backup_list ,pgBackupFree );
112+ parray_free (backup_list );
113+ }
114+
115+ if (delete_wal && !XLogRecPtrIsInvalid (oldest_lsn ))
84116{
85117XLogSegNo targetSegNo ;
86118char oldestSegmentNeeded [MAXFNAMELEN ];
@@ -263,7 +295,8 @@ pgBackupDeleteFiles(pgBackup *backup)
263295
264296time2iso (timestamp ,lengthof (timestamp ),backup -> start_time );
265297
266- elog (INFO ,"delete: %s" ,timestamp );
298+ elog (INFO ,"delete: %s %s" ,base36enc (backup -> start_time ),timestamp );
299+
267300
268301/*
269302 * Update STATUS to BACKUP_STATUS_DELETING in preparation for the case which
@@ -277,7 +310,7 @@ pgBackupDeleteFiles(pgBackup *backup)
277310
278311/* list files to be deleted */
279312files = parray_new ();
280- pgBackupGetPath (backup ,path ,lengthof (path ),DATABASE_DIR );
313+ pgBackupGetPath (backup ,path ,lengthof (path ),NULL );
281314dir_list_file (files ,path ,NULL , true, true);
282315
283316/* delete leaf node first */
@@ -304,16 +337,6 @@ pgBackupDeleteFiles(pgBackup *backup)
304337}
305338}
306339
307- /*
308- * After deleting all of the backup files, update STATUS to
309- * BACKUP_STATUS_DELETED.
310- */
311- if (!check )
312- {
313- backup -> status = BACKUP_STATUS_DELETED ;
314- pgBackupWriteIni (backup );
315- }
316-
317340parray_walk (files ,pgFileFree );
318341parray_free (files );
319342