Reduce chances of race conditions when processing deleted toots (#9815)
* Reduce chances of race conditions when processing deleted toots * Prevent race condition when processing deleted toots
This commit is contained in:
		
							parent
							
								
									5363c724fc
								
							
						
					
					
						commit
						a4f07bad95
					
				
					 2 changed files with 11 additions and 3 deletions
				
			
		| 
						 | 
					@ -5,10 +5,12 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 | 
				
			||||||
  CONVERTED_TYPES = %w(Image Video Article Page).freeze
 | 
					  CONVERTED_TYPES = %w(Image Video Article Page).freeze
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def perform
 | 
					  def perform
 | 
				
			||||||
    return if delete_arrived_first?(object_uri) || unsupported_object_type? || invalid_origin?(@object['id'])
 | 
					    return if unsupported_object_type? || invalid_origin?(@object['id'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    RedisLock.acquire(lock_options) do |lock|
 | 
					    RedisLock.acquire(lock_options) do |lock|
 | 
				
			||||||
      if lock.acquired?
 | 
					      if lock.acquired?
 | 
				
			||||||
 | 
					        return if delete_arrived_first?(object_uri)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @status = find_existing_status
 | 
					        @status = find_existing_status
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if @status.nil?
 | 
					        if @status.nil?
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,11 +21,13 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
 | 
				
			||||||
  def delete_note
 | 
					  def delete_note
 | 
				
			||||||
    return if object_uri.nil?
 | 
					    return if object_uri.nil?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    RedisLock.acquire(lock_options) do |_lock|
 | 
				
			||||||
 | 
					      delete_later!(object_uri)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @status   = Status.find_by(uri: object_uri, account: @account)
 | 
					    @status   = Status.find_by(uri: object_uri, account: @account)
 | 
				
			||||||
    @status ||= Status.find_by(uri: @object['atomUri'], account: @account) if @object.is_a?(Hash) && @object['atomUri'].present?
 | 
					    @status ||= Status.find_by(uri: @object['atomUri'], account: @account) if @object.is_a?(Hash) && @object['atomUri'].present?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    delete_later!(object_uri)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return if @status.nil?
 | 
					    return if @status.nil?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if @status.public_visibility? || @status.unlisted_visibility?
 | 
					    if @status.public_visibility? || @status.unlisted_visibility?
 | 
				
			||||||
| 
						 | 
					@ -68,4 +70,8 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
 | 
				
			||||||
  def payload
 | 
					  def payload
 | 
				
			||||||
    @payload ||= Oj.dump(@json)
 | 
					    @payload ||= Oj.dump(@json)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def lock_options
 | 
				
			||||||
 | 
					    { redis: Redis.current, key: "create:#{object_uri}" }
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue