forked from cybrespace/mastodon
		
	Reduce wasted work in RemoveStatusService due to inactive followers (#7672)
This commit is contained in:
		
							parent
							
								
									7706ed038f
								
							
						
					
					
						commit
						461542784b
					
				
					 4 changed files with 17 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -183,4 +183,15 @@ module AccountInteractions
 | 
			
		|||
  def pinned?(status)
 | 
			
		||||
    status_pins.where(status: status).exists?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def followers_for_local_distribution
 | 
			
		||||
    followers.local
 | 
			
		||||
             .joins(:user)
 | 
			
		||||
             .where('users.current_sign_in_at > ?', User::ACTIVE_DURATION.ago)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def lists_for_local_distribution
 | 
			
		||||
    lists.joins(account: :user)
 | 
			
		||||
         .where('users.current_sign_in_at > ?', User::ACTIVE_DURATION.ago)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -53,7 +53,7 @@ class BatchedRemoveStatusService < BaseService
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def unpush_from_home_timelines(account, statuses)
 | 
			
		||||
    recipients = account.followers.local.to_a
 | 
			
		||||
    recipients = account.followers_for_local_distribution.to_a
 | 
			
		||||
 | 
			
		||||
    recipients << account if account.local?
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -65,7 +65,7 @@ class BatchedRemoveStatusService < BaseService
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def unpush_from_list_timelines(account, statuses)
 | 
			
		||||
    account.lists.select(:id, :account_id).each do |list|
 | 
			
		||||
    account.lists_for_local_distribution.select(:id, :account_id).each do |list|
 | 
			
		||||
      statuses.each do |status|
 | 
			
		||||
        FeedManager.instance.unpush_from_list(list, status)
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,7 +38,7 @@ class FanOutOnWriteService < BaseService
 | 
			
		|||
  def deliver_to_followers(status)
 | 
			
		||||
    Rails.logger.debug "Delivering status #{status.id} to followers"
 | 
			
		||||
 | 
			
		||||
    status.account.followers.where(domain: nil).joins(:user).where('users.current_sign_in_at > ?', User::ACTIVE_DURATION.ago).select(:id).reorder(nil).find_in_batches do |followers|
 | 
			
		||||
    status.account.followers_for_local_distribution.select(:id).reorder(nil).find_in_batches do |followers|
 | 
			
		||||
      FeedInsertWorker.push_bulk(followers) do |follower|
 | 
			
		||||
        [status.id, follower.id, :home]
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			@ -48,7 +48,7 @@ class FanOutOnWriteService < BaseService
 | 
			
		|||
  def deliver_to_lists(status)
 | 
			
		||||
    Rails.logger.debug "Delivering status #{status.id} to lists"
 | 
			
		||||
 | 
			
		||||
    status.account.lists.joins(account: :user).where('users.current_sign_in_at > ?', User::ACTIVE_DURATION.ago).select(:id).reorder(nil).find_in_batches do |lists|
 | 
			
		||||
    status.account.lists_for_local_distribution.select(:id).reorder(nil).find_in_batches do |lists|
 | 
			
		||||
      FeedInsertWorker.push_bulk(lists) do |list|
 | 
			
		||||
        [status.id, list.id, :list]
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,13 +43,13 @@ class RemoveStatusService < BaseService
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def remove_from_followers
 | 
			
		||||
    @account.followers.local.find_each do |follower|
 | 
			
		||||
    @account.followers_for_local_distribution.find_each do |follower|
 | 
			
		||||
      FeedManager.instance.unpush_from_home(follower, @status)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def remove_from_lists
 | 
			
		||||
    @account.lists.select(:id, :account_id).find_each do |list|
 | 
			
		||||
    @account.lists_for_local_distribution.select(:id, :account_id).find_each do |list|
 | 
			
		||||
      FeedManager.instance.unpush_from_list(list, @status)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue