Fix incorrect and slow cache invalidation in ClearDomainMediaService (#19062)
Fixes #19060
This commit is contained in:
		
							parent
							
								
									1fac99e842
								
							
						
					
					
						commit
						c7147bab90
					
				| @ -10,24 +10,18 @@ class ClearDomainMediaService < BaseService | |||||||
| 
 | 
 | ||||||
|   private |   private | ||||||
| 
 | 
 | ||||||
|   def invalidate_association_caches! |   def invalidate_association_caches!(status_ids) | ||||||
|     # Normally, associated models of a status are immutable (except for accounts) |     # Normally, associated models of a status are immutable (except for accounts) | ||||||
|     # so they are aggressively cached. After updating the media attachments to no |     # 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 |     # longer point to a local file, we need to clear the cache to make those | ||||||
|     # changes appear in the API and UI |     # 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 |   end | ||||||
| 
 | 
 | ||||||
|   def clear_media! |   def clear_media! | ||||||
|     @affected_status_ids = [] |  | ||||||
| 
 |  | ||||||
|     begin |  | ||||||
|     clear_account_images! |     clear_account_images! | ||||||
|     clear_account_attachments! |     clear_account_attachments! | ||||||
|     clear_emojos! |     clear_emojos! | ||||||
|     ensure |  | ||||||
|       invalidate_association_caches! |  | ||||||
|     end |  | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def clear_account_images! |   def clear_account_images! | ||||||
| @ -39,13 +33,19 @@ class ClearDomainMediaService < BaseService | |||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def clear_account_attachments! |   def clear_account_attachments! | ||||||
|     media_from_blocked_domain.reorder(nil).find_each do |attachment| |     media_from_blocked_domain.reorder(nil).find_in_batches do |attachments| | ||||||
|       @affected_status_ids << attachment.status_id if attachment.status_id.present? |       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.file.destroy if attachment.file&.exists? | ||||||
|         attachment.type = :unknown |         attachment.type = :unknown | ||||||
|         attachment.save |         attachment.save | ||||||
|       end |       end | ||||||
|  | 
 | ||||||
|  |       invalidate_association_caches!(affected_status_ids) unless affected_status_ids.empty? | ||||||
|  |     end | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def clear_emojos! |   def clear_emojos! | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user