@@ -1021,48 +1021,16 @@ do_delete_instance(void)
10211021 return 0 ;
10221022}
10231023
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-
10561024/* Delete all backups of given status in instance */
10571025void
10581026do_delete_status (InstanceConfig * instance_config , const char * status )
10591027{
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 ];
10661034 pgBackup * backup ;
10671035
10681036 BackupStatus status_for_delete = str2status (status );
@@ -1086,44 +1054,49 @@ do_delete_status(InstanceConfig *instance_config, const char *status)
10861054 return ;
10871055 }
10881056
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 );
10901061
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. */
10921063 for (i = 0 ; i < parray_num (backup_list ); i ++ )
10931064 {
10941065 backup = (pgBackup * ) parray_get (backup_list , i );
10951066
10961067 if (backup -> status == status_for_delete )
10971068 {
10981069 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 ;
11001074 parray_append (delete_list , backup );
1101- append_childs (backup_list , backup , delete_list );
1075+
1076+ append_children (backup_list , backup , delete_list );
11021077 }
11031078 }
1079+
1080+ parray_qsort (delete_list , pgBackupCompareIdDesc );
1081+
11041082 /* delete and calculate free size from delete_list */
11051083 for (i = 0 ; i < parray_num (delete_list ); i ++ )
11061084 {
11071085 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" ,
11091088 base36enc (backup -> start_time ), status2str (backup -> status ), dry_run ? "can" : "will" );
11101089
11111090 size_to_delete += backup -> data_bytes ;
11121091 if (backup -> stream )
11131092 size_to_delete += backup -> wal_bytes ;
11141093
1115-
11161094 if (!dry_run && lock_backup (backup ))
1117- {
1118- if (interrupted )
1119- elog (ERROR , "interrupted during delete backup" );
1120-
11211095 delete_backup_files (backup );
1122- n_deleted ++ ;
1123-
1124- }
11251096
1097+ n_deleted ++ ;
11261098 }
1099+
11271100 /* Inform about data size to free */
11281101 if (size_to_delete >= 0 )
11291102 {
@@ -1133,7 +1106,7 @@ do_delete_status(InstanceConfig *instance_config, const char *status)
11331106 }
11341107
11351108 /* delete selected backups */
1136- if (!dry_run )
1109+ if (!dry_run && n_deleted > 0 )
11371110 elog (INFO , "Successfully deleted %i %s from instance '%s'" ,
11381111 n_deleted , n_deleted == 1 ? "backup" : "backups" ,
11391112 instance_config -> name );
@@ -1143,9 +1116,8 @@ do_delete_status(InstanceConfig *instance_config, const char *status)
11431116 elog (WARNING , "Instance '%s' has no backups with status '%s'" ,
11441117 instance_config -> name , pretty_status );
11451118
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.
11491121
11501122 /* Cleanup */
11511123 parray_free (delete_list );
0 commit comments