From ee5cd8330d7bd49ea2089f1f8cdef7bc25ac7ab1 Mon Sep 17 00:00:00 2001 From: evazion Date: Wed, 22 Sep 2021 13:14:14 -0500 Subject: [PATCH] uploads: fix exception when pruning expired uploads. Hourly pruning of expired uploads was failing because of nil deference errors in `media_asset.destroy!`. There are various cases where an upload doesn't have a media asset, for example when the source url fails to download or when the upload is of an invalid filetype. --- app/models/upload.rb | 2 +- test/unit/upload_service_test.rb | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/models/upload.rb b/app/models/upload.rb index d926579e5..387be4e49 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -115,7 +115,7 @@ class Upload < ApplicationRecord return end - media_asset.destroy! + media_asset&.destroy! DanbooruLogger.info("Uploads: Deleting files for upload md5=#{md5}") Danbooru.config.storage_manager.delete_file(nil, md5, file_ext, :original) Danbooru.config.storage_manager.delete_file(nil, md5, file_ext, :large) diff --git a/test/unit/upload_service_test.rb b/test/unit/upload_service_test.rb index e03f7dbe5..48b5b05e1 100644 --- a/test/unit/upload_service_test.rb +++ b/test/unit/upload_service_test.rb @@ -1033,5 +1033,12 @@ class UploadServiceTest < ActiveSupport::TestCase assert(@upload.is_errored?) assert_difference("Upload.count", -1) { @upload.destroy! } end + + should "work on uploads with an invalid file" do + @upload = as(@user) { UploadService.new(file: upload_file("test/files/test-empty.bin")).start! } + + assert(@upload.is_errored?) + assert_difference("Upload.count", -1) { @upload.destroy! } + end end end