diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb index 7b0a08af2907d47009bd6bbb3b4e9ecc2b62efb1..7e38aacc91a39c527f262af65527a9a475fb58f0 100644 --- a/app/services/projects/destroy_service.rb +++ b/app/services/projects/destroy_service.rb @@ -25,27 +25,15 @@ module Projects Projects::UnlinkForkService.new(project, current_user).execute - Project.transaction do - unless remove_legacy_registry_tags - raise_error('Failed to remove some tags in project container registry. Please try again or contact administrator.') - end - - unless remove_repository(repo_path) - raise_error('Failed to remove project repository. Please try again or contact administrator.') - end - - unless remove_repository(wiki_path) - raise_error('Failed to remove wiki repository. Please try again or contact administrator.') - end - - project.team.truncate - project.destroy! - end + attempt_destroy_transaction(project, repo_path, wiki_path) system_hook_service.execute_hooks_for(project, :destroy) log_info("Project \"#{project.full_path}\" was removed") true + rescue Projects::DestroyService::DestroyError => error + Rails.logger.error("Deletion failed on #{project.full_path} with the following message: #{error.message}") + false end private @@ -71,6 +59,28 @@ module Projects end end + def attempt_destroy_transaction(project, repo_path, wiki_path) + Project.transaction do + unless remove_legacy_registry_tags + raise_error('Failed to remove some tags in project container registry. Please try again or contact administrator.') + end + + unless remove_repository(repo_path) + raise_error('Failed to remove project repository. Please try again or contact administrator.') + end + + unless remove_repository(wiki_path) + raise_error('Failed to remove wiki repository. Please try again or contact administrator.') + end + + project.team.truncate + project.destroy! + end + rescue Exception => error # rubocop:disable Lint/RescueException + project.update_attributes(delete_error: error.message, pending_delete: false) + raise + end + ## # This method makes sure that we correctly remove registry tags # for legacy image repository (when repository path equals project path). diff --git a/app/workers/project_destroy_worker.rb b/app/workers/project_destroy_worker.rb index 209cf11e8936142e1f4348b522b00dac413aac79..e695ec060f0e9c934652f4a0c4ab49ad52da0f06 100644 --- a/app/workers/project_destroy_worker.rb +++ b/app/workers/project_destroy_worker.rb @@ -7,10 +7,7 @@ class ProjectDestroyWorker user = User.find(user_id) ::Projects::DestroyService.new(project, user, params.symbolize_keys).execute - rescue Exception => error # rubocop:disable Lint/RescueException - project&.update_attributes(delete_error: error.message, pending_delete: false) - Rails.logger.error("Deletion failed on #{project&.full_path} with the following message: #{error.message}") - - raise + rescue ActiveRecord::RecordNotFound => error + logger.error("Failed to delete project #{project.path_with_namespace} (#{project.id}): #{error.message}") end end