Skip to content
Snippets Groups Projects
Unverified Commit 38dc51b2 authored by Eugen Rochko's avatar Eugen Rochko Committed by GitHub
Browse files

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

Don't put Move handler on cooldown if it didn't run. Skip unmerging
from timelines to save unnecessary work.
parent c21386cf
No related branches found
No related tags found
No related merge requests found
......@@ -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
......@@ -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
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment