@@ -1021,41 +1021,36 @@ do_delete_instance(void)
1021
1021
return 0 ;
1022
1022
}
1023
1023
1024
- /* checks that backup childs has status like parent */
1025
- bool checkChilds (parray * backup_list , time_t backup_id )
1024
+ /* checks that parray contains element */
1025
+ bool parray_contains (parray * array , void * elem )
1026
1026
{
1027
1027
int i ;
1028
- pgBackup * target_backup = NULL ;
1029
- pgBackup * backup ;
1030
- /* search target bakcup */
1031
- for (i = 0 ; i < parray_num (backup_list ); i ++ )
1028
+ for (i = 0 ; i < parray_num (array ); i ++ )
1032
1029
{
1033
- backup = (pgBackup * )parray_get (backup_list , i );
1034
- if (backup -> start_time == backup_id )
1035
- {
1036
- target_backup = backup ;
1037
- break ;
1038
- }
1030
+ if (parray_get (array , i ) == elem ) return true;
1039
1031
}
1040
- if (target_backup == NULL ) return false;
1032
+ return false;
1033
+ }
1034
+
1041
1035
1042
- /* check childs */
1036
+ void append_childs (parray * backup_list , pgBackup * target_backup , parray * delete_list )
1037
+ {
1038
+ int i ;
1039
+ pgBackup * backup ;
1043
1040
for (i = 0 ; i < parray_num (backup_list ); i ++ )
1044
1041
{
1045
1042
backup = (pgBackup * )parray_get (backup_list , i );
1043
+ if (backup == target_backup ) continue ;
1046
1044
/* check if backup is descendant of delete target */
1047
1045
if (is_parent (target_backup -> start_time , backup , false))
1048
1046
{
1049
- if (backup -> status != target_backup -> status ){
1050
- elog (INFO , "Skip deleting the backup %s because the backup has children with a different status" ,
1051
- base36enc (target_backup -> start_time ));
1052
- return false;
1053
- }
1047
+ if (!parray_contains (delete_list , backup ))
1048
+ parray_append (delete_list , backup );
1054
1049
/* recursive call */
1055
- if (! checkChilds ( backup_list , backup -> start_time )) return false ;
1050
+ append_childs ( backup_list , backup , delete_list ) ;
1056
1051
}
1057
1052
}
1058
- return true;
1053
+
1059
1054
}
1060
1055
1061
1056
/* Delete all backups of given status in instance */
@@ -1093,30 +1088,42 @@ do_delete_status(InstanceConfig *instance_config, const char *status)
1093
1088
1094
1089
elog (INFO , "Deleting all backups with status '%s'" , pretty_status );
1095
1090
1096
- /* Selects backups for deleting to delete_list array. Will delete all backups with specified status */
1091
+ /* Selects backups for deleting to delete_list array. Will delete all backups with specified status and childs */
1097
1092
for (i = 0 ; i < parray_num (backup_list ); i ++ )
1098
1093
{
1099
1094
backup = (pgBackup * ) parray_get (backup_list , i );
1100
1095
1101
1096
if (backup -> status == status_for_delete )
1102
1097
{
1103
-
1104
1098
n_found ++ ;
1105
- if (!checkChilds (backup_list , backup -> start_time )) continue ;
1099
+ if (parray_contains (delete_list , backup )) continue ;
1100
+ parray_append (delete_list , backup );
1101
+ append_childs (backup_list , backup , delete_list );
1102
+ }
1103
+ }
1104
+ /* delete and calculate free size from delete_list */
1105
+ for (i = 0 ; i < parray_num (delete_list ); i ++ )
1106
+ {
1107
+ backup = (pgBackup * )parray_get (delete_list , i );
1108
+ elog (dry_run ? INFO : LOG , "Backup %s with status %s %s be deleted" ,
1109
+ base36enc (backup -> start_time ), status2str (backup -> status ), dry_run ? "can" : "will" );
1106
1110
1107
- elog (dry_run ? INFO : LOG , "Backup %s %s be deleted" ,
1108
- base36enc (backup -> start_time ), dry_run ? "can" : "will" );
1109
- size_to_delete += backup -> data_bytes ;
1110
- if (backup -> stream )
1111
- size_to_delete += backup -> wal_bytes ;
1112
- if (!dry_run ){
1113
- parray_append (delete_list , backup );
1114
- }
1111
+ size_to_delete += backup -> data_bytes ;
1112
+ if (backup -> stream )
1113
+ size_to_delete += backup -> wal_bytes ;
1114
+
1115
+
1116
+ if (!dry_run && lock_backup (backup ))
1117
+ {
1118
+ if (interrupted )
1119
+ elog (ERROR , "interrupted during delete backup" );
1120
+
1121
+ delete_backup_files (backup );
1115
1122
n_deleted ++ ;
1116
1123
1117
1124
}
1118
- }
1119
1125
1126
+ }
1120
1127
/* Inform about data size to free */
1121
1128
if (size_to_delete >= 0 )
1122
1129
{
@@ -1127,27 +1134,19 @@ do_delete_status(InstanceConfig *instance_config, const char *status)
1127
1134
1128
1135
/* delete selected backups */
1129
1136
if (!dry_run )
1130
- {
1131
- for (i = 0 ; i < parray_num (delete_list ); i ++ )
1132
- {
1133
- backup = (pgBackup * )parray_get (delete_list , i );
1134
- if (lock_backup (backup ))
1135
- {
1136
- delete_backup_files (backup );
1137
- }
1138
- else n_deleted -- ;
1139
- }
1140
- elog (INFO , "Successfully deleted %i %s with status '%s' from instance '%s'" ,
1137
+ elog (INFO , "Successfully deleted %i %s from instance '%s'" ,
1141
1138
n_deleted , n_deleted == 1 ? "backup" : "backups" ,
1142
- pretty_status , instance_config -> name );
1143
-
1144
- }
1139
+ instance_config -> name );
1145
1140
1146
1141
1147
1142
if (n_found == 0 )
1148
1143
elog (WARNING , "Instance '%s' has no backups with status '%s'" ,
1149
1144
instance_config -> name , pretty_status );
1150
1145
1146
+ /* Clean WAL segments */
1147
+ if (delete_wal )
1148
+ do_retention_wal (dry_run );
1149
+
1151
1150
/* Cleanup */
1152
1151
parray_free (delete_list );
1153
1152
parray_walk (backup_list , pgBackupFree );
0 commit comments