From 63c3758e72bc0ce660d1deafa519c4fe53367823 Mon Sep 17 00:00:00 2001 From: Shlee Date: Wed, 29 Jul 2026 18:15:56 +0930 Subject: [PATCH] Fix attachment_batch to correctly resets retries for S3 storage loops. (#39979) --- app/lib/attachment_batch.rb | 39 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/app/lib/attachment_batch.rb b/app/lib/attachment_batch.rb index 1443a1ec60c..fad89110dba 100644 --- a/app/lib/attachment_batch.rb +++ b/app/lib/attachment_batch.rb @@ -54,10 +54,9 @@ class AttachmentBatch records.each do |record| @attachment_names.each do |attachment_name| attachment = record.public_send(attachment_name) - styles = BASE_STYLES | attachment.styles.keys - next if attachment.blank? + styles = BASE_STYLES | attachment.styles.keys styles.each do |style| case @storage_mode when :s3 @@ -108,26 +107,26 @@ class AttachmentBatch # objects can be processed at once, so we have to potentially # separate them into multiple calls. - retries = 0 keys.each_slice(LIMIT) do |keys_slice| logger.debug { "Deleting #{keys_slice.size} objects" } - - with_overridden_timeout(bucket.client, 120) do - bucket.delete_objects(delete: { - objects: keys_slice.map { |key| { key: key } }, - quiet: true, - }) - end - rescue => e - retries += 1 - - if retries < MAX_RETRY - logger.debug "Retry #{retries}/#{MAX_RETRY} after #{e.message}" - sleep 2**retries - retry - else - logger.error "Batch deletion from S3 failed after #{e.message}" - raise e + retries = 0 # Reset for each slice + begin + with_overridden_timeout(bucket.client, 120) do + bucket.delete_objects(delete: { + objects: keys_slice.map { |key| { key: key } }, + quiet: true, + }) + end + rescue => e + retries += 1 + if retries < MAX_RETRY + logger.debug "Retry #{retries}/#{MAX_RETRY} after #{e.message}" + sleep 2**retries + retry + else + logger.error "Batch deletion from S3 failed after #{e.message}" + raise e + end end end end