@@ -1021,48 +1021,16 @@ do_delete_instance(void)
1021
1021
return 0 ;
1022
1022
}
1023
1023
1024
- /* checks that parray contains element */
1025
- bool parray_contains (parray * array , void * elem )
1026
- {
1027
- int i ;
1028
- for (i = 0 ; i < parray_num (array ); i ++ )
1029
- {
1030
- if (parray_get (array , i ) == elem ) return true;
1031
- }
1032
- return false;
1033
- }
1034
-
1035
-
1036
- void append_childs (parray * backup_list , pgBackup * target_backup , parray * delete_list )
1037
- {
1038
- int i ;
1039
- pgBackup * backup ;
1040
- for (i = 0 ; i < parray_num (backup_list ); i ++ )
1041
- {
1042
- backup = (pgBackup * )parray_get (backup_list , i );
1043
- if (backup == target_backup ) continue ;
1044
- /* check if backup is descendant of delete target */
1045
- if (is_parent (target_backup -> start_time , backup , false))
1046
- {
1047
- if (!parray_contains (delete_list , backup ))
1048
- parray_append (delete_list , backup );
1049
- /* recursive call */
1050
- append_childs (backup_list , backup , delete_list );
1051
- }
1052
- }
1053
-
1054
- }
1055
-
1056
1024
/* Delete all backups of given status in instance */
1057
1025
void
1058
1026
do_delete_status (InstanceConfig * instance_config , const char * status )
1059
1027
{
1060
- parray * backup_list , * delete_list ; ;
1061
- int i ;
1062
- const char * pretty_status ;
1063
- int n_deleted = 0 , n_found = 0 ;
1064
- size_t size_to_delete = 0 ;
1065
- char size_to_delete_pretty [20 ];
1028
+ int i ;
1029
+ parray * backup_list , * delete_list ;
1030
+ const char * pretty_status ;
1031
+ int n_deleted = 0 , n_found = 0 ;
1032
+ size_t size_to_delete = 0 ;
1033
+ char size_to_delete_pretty [20 ];
1066
1034
pgBackup * backup ;
1067
1035
1068
1036
BackupStatus status_for_delete = str2status (status );
@@ -1086,44 +1054,49 @@ do_delete_status(InstanceConfig *instance_config, const char *status)
1086
1054
return ;
1087
1055
}
1088
1056
1089
- elog (INFO , "Deleting all backups with status '%s'" , pretty_status );
1057
+ if (dry_run )
1058
+ elog (INFO , "Deleting all backups with status '%s' in dry run mode" , pretty_status );
1059
+ else
1060
+ elog (INFO , "Deleting all backups with status '%s'" , pretty_status );
1090
1061
1091
- /* Selects backups for deleting to delete_list array. Will delete all backups with specified status and childs */
1062
+ /* Selects backups with specified status and their children into delete_list array. */
1092
1063
for (i = 0 ; i < parray_num (backup_list ); i ++ )
1093
1064
{
1094
1065
backup = (pgBackup * ) parray_get (backup_list , i );
1095
1066
1096
1067
if (backup -> status == status_for_delete )
1097
1068
{
1098
1069
n_found ++ ;
1099
- if (parray_contains (delete_list , backup )) continue ;
1070
+
1071
+ /* incremental backup can be already in delete_list due to append_children() */
1072
+ if (parray_contains (delete_list , backup ))
1073
+ continue ;
1100
1074
parray_append (delete_list , backup );
1101
- append_childs (backup_list , backup , delete_list );
1075
+
1076
+ append_children (backup_list , backup , delete_list );
1102
1077
}
1103
1078
}
1079
+
1080
+ parray_qsort (delete_list , pgBackupCompareIdDesc );
1081
+
1104
1082
/* delete and calculate free size from delete_list */
1105
1083
for (i = 0 ; i < parray_num (delete_list ); i ++ )
1106
1084
{
1107
1085
backup = (pgBackup * )parray_get (delete_list , i );
1108
- elog (dry_run ? INFO : LOG , "Backup %s with status %s %s be deleted" ,
1086
+
1087
+ elog (INFO , "Backup %s with status %s %s be deleted" ,
1109
1088
base36enc (backup -> start_time ), status2str (backup -> status ), dry_run ? "can" : "will" );
1110
1089
1111
1090
size_to_delete += backup -> data_bytes ;
1112
1091
if (backup -> stream )
1113
1092
size_to_delete += backup -> wal_bytes ;
1114
1093
1115
-
1116
1094
if (!dry_run && lock_backup (backup ))
1117
- {
1118
- if (interrupted )
1119
- elog (ERROR , "interrupted during delete backup" );
1120
-
1121
1095
delete_backup_files (backup );
1122
- n_deleted ++ ;
1123
-
1124
- }
1125
1096
1097
+ n_deleted ++ ;
1126
1098
}
1099
+
1127
1100
/* Inform about data size to free */
1128
1101
if (size_to_delete >= 0 )
1129
1102
{
@@ -1133,7 +1106,7 @@ do_delete_status(InstanceConfig *instance_config, const char *status)
1133
1106
}
1134
1107
1135
1108
/* delete selected backups */
1136
- if (!dry_run )
1109
+ if (!dry_run && n_deleted > 0 )
1137
1110
elog (INFO , "Successfully deleted %i %s from instance '%s'" ,
1138
1111
n_deleted , n_deleted == 1 ? "backup" : "backups" ,
1139
1112
instance_config -> name );
@@ -1143,9 +1116,8 @@ do_delete_status(InstanceConfig *instance_config, const char *status)
1143
1116
elog (WARNING , "Instance '%s' has no backups with status '%s'" ,
1144
1117
instance_config -> name , pretty_status );
1145
1118
1146
- /* Clean WAL segments */
1147
- if (delete_wal )
1148
- do_retention_wal (dry_run );
1119
+ // we don`t do WAL purge here, because it is impossible to correctly handle
1120
+ // dry-run case.
1149
1121
1150
1122
/* Cleanup */
1151
1123
parray_free (delete_list );
0 commit comments