Fix to add RedisLock to handle Announce activity (#14365)
This commit is contained in:
		
							parent
							
								
									0ab97107c7
								
							
						
					
					
						commit
						fcb3f259e5
					
				@ -4,25 +4,32 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
 | 
				
			|||||||
  def perform
 | 
					  def perform
 | 
				
			||||||
    return reject_payload! if delete_arrived_first?(@json['id']) || !related_to_local_activity?
 | 
					    return reject_payload! if delete_arrived_first?(@json['id']) || !related_to_local_activity?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    original_status = status_from_object
 | 
					    RedisLock.acquire(lock_options) do |lock|
 | 
				
			||||||
 | 
					      if lock.acquired?
 | 
				
			||||||
 | 
					        original_status = status_from_object
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return reject_payload! if original_status.nil? || !announceable?(original_status)
 | 
					        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,
 | 
					          account: @account,
 | 
				
			||||||
      reblog: original_status,
 | 
					          reblog: original_status,
 | 
				
			||||||
      uri: @json['id'],
 | 
					          uri: @json['id'],
 | 
				
			||||||
      created_at: @json['published'],
 | 
					          created_at: @json['published'],
 | 
				
			||||||
      override_timestamps: @options[:override_timestamps],
 | 
					          override_timestamps: @options[:override_timestamps],
 | 
				
			||||||
      visibility: visibility_from_audience
 | 
					          visibility: visibility_from_audience
 | 
				
			||||||
    )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    distribute(status)
 | 
					        distribute(@status)
 | 
				
			||||||
    status
 | 
					      else
 | 
				
			||||||
 | 
					        raise Mastodon::RaceConditionError
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @status
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private
 | 
					  private
 | 
				
			||||||
@ -54,4 +61,8 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
 | 
				
			|||||||
  def reblog_of_local_status?
 | 
					  def reblog_of_local_status?
 | 
				
			||||||
    status_from_uri(object_uri)&.account&.local?
 | 
					    status_from_uri(object_uri)&.account&.local?
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def lock_options
 | 
				
			||||||
 | 
					    { redis: Redis.current, key: "announce:#{@object['id']}" }
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user