Fix to add RedisLock to handle Announce activity (#14365)
This commit is contained in:
		@@ -4,15 +4,17 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
 | 
			
		||||
  def perform
 | 
			
		||||
    return reject_payload! if delete_arrived_first?(@json['id']) || !related_to_local_activity?
 | 
			
		||||
 | 
			
		||||
    RedisLock.acquire(lock_options) do |lock|
 | 
			
		||||
      if lock.acquired?
 | 
			
		||||
        original_status = status_from_object
 | 
			
		||||
 | 
			
		||||
        return reject_payload! if original_status.nil? || !announceable?(original_status)
 | 
			
		||||
 | 
			
		||||
    status = Status.find_by(account: @account, reblog: original_status)
 | 
			
		||||
        @status = Status.find_by(account: @account, reblog: original_status)
 | 
			
		||||
 | 
			
		||||
    return status unless status.nil?
 | 
			
		||||
        return @status unless @status.nil?
 | 
			
		||||
 | 
			
		||||
    status = Status.create!(
 | 
			
		||||
        @status = Status.create!(
 | 
			
		||||
          account: @account,
 | 
			
		||||
          reblog: original_status,
 | 
			
		||||
          uri: @json['id'],
 | 
			
		||||
@@ -21,8 +23,13 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
 | 
			
		||||
          visibility: visibility_from_audience
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    distribute(status)
 | 
			
		||||
    status
 | 
			
		||||
        distribute(@status)
 | 
			
		||||
      else
 | 
			
		||||
        raise Mastodon::RaceConditionError
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    @status
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
@@ -54,4 +61,8 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
 | 
			
		||||
  def reblog_of_local_status?
 | 
			
		||||
    status_from_uri(object_uri)&.account&.local?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def lock_options
 | 
			
		||||
    { redis: Redis.current, key: "announce:#{@object['id']}" }
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user