Fix Move handler queuing jobs that will fail if account is suspended ()

Don't put Move handler on cooldown if it didn't run. Skip unmerging
from timelines to save unnecessary work.
This commit is contained in:
Eugen Rochko 2019-09-17 08:44:45 +02:00 committed by GitHub
parent c21386cff5
commit 38dc51b2d6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 5 deletions
app
lib/activitypub/activity
services
workers

View File

@ -10,10 +10,13 @@ class ActivityPub::Activity::Move < ActivityPub::Activity
target_account = ActivityPub::FetchRemoteAccountService.new.call(target_uri)
return if target_account.nil? || !target_account.also_known_as.include?(origin_account.uri)
if target_account.nil? || target_account.suspended? || !target_account.also_known_as.include?(origin_account.uri)
unmark_as_processing!
return
end
# In case for some reason we didn't have a redirect for the profile already, set it
origin_account.update(moved_to_account: target_account) if origin_account.moved_to_account_id.nil?
origin_account.update(moved_to_account: target_account)
# Initiate a re-follow for each follower
origin_account.followers.local.select(:id).find_in_batches do |follower_accounts|
@ -40,4 +43,8 @@ class ActivityPub::Activity::Move < ActivityPub::Activity
def mark_as_processing!
redis.setex("move_in_progress:#{@account.id}", PROCESSING_COOLDOWN, true)
end
def unmark_as_processing!
redis.del("move_in_progress:#{@account.id}")
end
end

View File

@ -6,9 +6,12 @@ class UnfollowService < BaseService
# Unfollow and notify the remote user
# @param [Account] source_account Where to unfollow from
# @param [Account] target_account Which to unfollow
def call(source_account, target_account)
# @param [Hash] options
# @option [Boolean] :skip_unmerge
def call(source_account, target_account, options = {})
@source_account = source_account
@target_account = target_account
@options = options
unfollow! || undo_follow_request!
end
@ -21,9 +24,11 @@ class UnfollowService < BaseService
return unless follow
follow.destroy!
create_notification(follow) if !@target_account.local? && @target_account.activitypub?
create_reject_notification(follow) if @target_account.local? && !@source_account.local? && @source_account.activitypub?
UnmergeWorker.perform_async(@target_account.id, @source_account.id)
UnmergeWorker.perform_async(@target_account.id, @source_account.id) unless @options[:skip_unmerge]
follow
end
@ -33,7 +38,9 @@ class UnfollowService < BaseService
return unless follow_request
follow_request.destroy!
create_notification(follow_request) unless @target_account.local?
follow_request
end

View File

@ -11,7 +11,7 @@ class UnfollowFollowWorker
new_target_account = Account.find(new_target_account_id)
FollowService.new.call(follower_account, new_target_account)
UnfollowService.new.call(follower_account, old_target_account)
UnfollowService.new.call(follower_account, old_target_account, skip_unmerge: true)
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
true
end