22
22
do_delete (time_t backup_id )
23
23
{
24
24
int i ;
25
- int last_index ;
26
- parray * backup_list ;
27
- pgBackup * last_backup = NULL ;
25
+ parray * backup_list ,
26
+ * delete_list ;
27
+ time_t parent_id = 0 ;
28
+ bool backup_found = false;
28
29
29
30
/* DATE are always required */
30
31
if (backup_id == 0 )
@@ -38,47 +39,59 @@ do_delete(time_t backup_id)
38
39
if (!backup_list )
39
40
elog (ERROR , "no backup list found, can't process any more" );
40
41
41
- /* Find backup to be deleted */
42
- for (i = 0 ; i < parray_num (backup_list ); i ++ )
42
+ delete_list = parray_new ();
43
+
44
+ /* Find backup to be deleted and make increment backups array to be deleted */
45
+ for (i = (int ) parray_num (backup_list ) - 1 ; i >= 0 ; i -- )
43
46
{
44
- last_backup = (pgBackup * ) parray_get (backup_list , i );
45
- if (last_backup -> start_time == backup_id )
46
- goto found_backup ;
47
- }
47
+ pgBackup * backup = (pgBackup * ) parray_get (backup_list , (size_t ) i );
48
48
49
- elog (ERROR , "no backup found, cannot delete." );
49
+ if (backup -> start_time == backup_id )
50
+ {
51
+ parray_append (delete_list , backup );
50
52
51
- found_backup :
52
- last_index = i ;
53
- /* check for interrupt */
54
- if (interrupted )
55
- elog (ERROR , "interrupted during delete backup" );
53
+ /*
54
+ * Do not remove next backups, if target backup was finished
55
+ * incorrectly.
56
+ */
57
+ if (backup -> status == BACKUP_STATUS_ERROR )
58
+ break ;
56
59
57
- /* just do it */
58
- pgBackupDeleteFiles (last_backup );
60
+ /* Save backup id to retreive increment backups */
61
+ parent_id = backup -> start_time ;
62
+ backup_found = true;
63
+ }
64
+ else if (backup_found )
65
+ {
66
+ if (backup -> backup_mode != BACKUP_MODE_FULL &&
67
+ backup -> parent_backup == parent_id )
68
+ {
69
+ /* Append to delete list increment backup */
70
+ parray_append (delete_list , backup );
71
+ /* Save backup id to retreive increment backups */
72
+ parent_id = backup -> start_time ;
73
+ }
74
+ else
75
+ break ;
76
+ }
77
+ }
59
78
60
- /*
61
- * Do not remove next backups, if current backup is not full backup and
62
- * was finished incorrectly.
63
- */
64
- if (last_backup -> status != BACKUP_STATUS_OK &&
65
- last_backup -> status != BACKUP_STATUS_CORRUPT &&
66
- last_backup -> backup_mode != BACKUP_MODE_FULL )
67
- return 0 ;
79
+ if (parray_num (delete_list ) == 0 )
80
+ elog (ERROR , "no backup found, cannot delete" );
68
81
69
- /* Remove all increments after removed backup */
70
- for (i = last_index - 1 ; i >= 0 ; i -- )
82
+ /* Delete backups from the end of list */
83
+ for (i = ( int ) parray_num ( delete_list ) - 1 ; i >= 0 ; i -- )
71
84
{
72
- pgBackup * backup = (pgBackup * ) parray_get (backup_list , i );
85
+ pgBackup * backup = (pgBackup * ) parray_get (delete_list , ( size_t ) i );
73
86
74
- /* Stop removing increments */
75
- if (backup -> backup_mode >= BACKUP_MODE_FULL )
76
- break ;
87
+ if (interrupted )
88
+ elog (ERROR , "interrupted during delete backup" );
77
89
78
90
pgBackupDeleteFiles (backup );
79
91
}
80
92
81
93
/* cleanup */
94
+ parray_free (delete_list );
82
95
parray_walk (backup_list , pgBackupFree );
83
96
parray_free (backup_list );
84
97
@@ -295,6 +308,7 @@ pgBackupDeleteFiles(pgBackup *backup)
295
308
296
309
parray_walk (files , pgFileFree );
297
310
parray_free (files );
311
+ backup -> status = BACKUP_STATUS_DELETED ;
298
312
299
313
return 0 ;
300
314
}
0 commit comments