summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClaire <claire.github-309c@sitedethib.com>2022-08-27 00:45:54 +0200
committerGitHub <noreply@github.com>2022-08-27 00:45:54 +0200
commitc7147bab908aca4cefd17d527e7cbfe3b6e5d3a6 (patch)
tree4022c412a23e2ee06670f1cde263d76e9e1fd161
parent1fac99e842c99e8f6aef9429ee1f19c7e63f7b07 (diff)
Fix incorrect and slow cache invalidation in ClearDomainMediaService (#19062)
Fixes #19060
-rw-r--r--app/services/clear_domain_media_service.rb32
1 files changed, 16 insertions, 16 deletions
diff --git a/app/services/clear_domain_media_service.rb b/app/services/clear_domain_media_service.rb
index 704cfb71a6e..9e70ebe51c7 100644
--- a/app/services/clear_domain_media_service.rb
+++ b/app/services/clear_domain_media_service.rb
@@ -10,24 +10,18 @@ class ClearDomainMediaService < BaseService
private
- def invalidate_association_caches!
+ def invalidate_association_caches!(status_ids)
# Normally, associated models of a status are immutable (except for accounts)
# so they are aggressively cached. After updating the media attachments to no
# longer point to a local file, we need to clear the cache to make those
# changes appear in the API and UI
- @affected_status_ids.each { |id| Rails.cache.delete_matched("statuses/#{id}-*") }
+ Rails.cache.delete_multi(status_ids.map { |id| "statuses/#{id}" })
end
def clear_media!
- @affected_status_ids = []
-
- begin
- clear_account_images!
- clear_account_attachments!
- clear_emojos!
- ensure
- invalidate_association_caches!
- end
+ clear_account_images!
+ clear_account_attachments!
+ clear_emojos!
end
def clear_account_images!
@@ -39,12 +33,18 @@ class ClearDomainMediaService < BaseService
end
def clear_account_attachments!
- media_from_blocked_domain.reorder(nil).find_each do |attachment|
- @affected_status_ids << attachment.status_id if attachment.status_id.present?
+ media_from_blocked_domain.reorder(nil).find_in_batches do |attachments|
+ affected_status_ids = []
+
+ attachments.each do |attachment|
+ affected_status_ids << attachment.status_id if attachment.status_id.present?
+
+ attachment.file.destroy if attachment.file&.exists?
+ attachment.type = :unknown
+ attachment.save
+ end
- attachment.file.destroy if attachment.file&.exists?
- attachment.type = :unknown
- attachment.save
+ invalidate_association_caches!(affected_status_ids) unless affected_status_ids.empty?
end
end