Reduce wasted work in RemoveStatusService due to inactive followers (#7672)

This commit is contained in:
Eugen Rochko 2018-05-29 22:55:33 +02:00 committed by GitHub
parent 7706ed038f
commit 461542784b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 17 additions and 6 deletions

View file

@ -183,4 +183,15 @@ module AccountInteractions
def pinned?(status) def pinned?(status)
status_pins.where(status: status).exists? status_pins.where(status: status).exists?
end 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 end

View file

@ -53,7 +53,7 @@ class BatchedRemoveStatusService < BaseService
end end
def unpush_from_home_timelines(account, statuses) 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? recipients << account if account.local?
@ -65,7 +65,7 @@ class BatchedRemoveStatusService < BaseService
end end
def unpush_from_list_timelines(account, statuses) 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| statuses.each do |status|
FeedManager.instance.unpush_from_list(list, status) FeedManager.instance.unpush_from_list(list, status)
end end

View file

@ -38,7 +38,7 @@ class FanOutOnWriteService < BaseService
def deliver_to_followers(status) def deliver_to_followers(status)
Rails.logger.debug "Delivering status #{status.id} to followers" 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| FeedInsertWorker.push_bulk(followers) do |follower|
[status.id, follower.id, :home] [status.id, follower.id, :home]
end end
@ -48,7 +48,7 @@ class FanOutOnWriteService < BaseService
def deliver_to_lists(status) def deliver_to_lists(status)
Rails.logger.debug "Delivering status #{status.id} to lists" 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| FeedInsertWorker.push_bulk(lists) do |list|
[status.id, list.id, :list] [status.id, list.id, :list]
end end

View file

@ -43,13 +43,13 @@ class RemoveStatusService < BaseService
end end
def remove_from_followers 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) FeedManager.instance.unpush_from_home(follower, @status)
end end
end end
def remove_from_lists 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) FeedManager.instance.unpush_from_list(list, @status)
end end
end end