Avoid nested transactions when fetching quote posts (#35657)
This commit is contained in:
		@@ -64,6 +64,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 | 
			
		||||
    resolve_thread(@status)
 | 
			
		||||
    resolve_unresolved_mentions(@status)
 | 
			
		||||
    fetch_replies(@status)
 | 
			
		||||
    fetch_and_verify_quote
 | 
			
		||||
    distribute
 | 
			
		||||
    forward_for_reply
 | 
			
		||||
  end
 | 
			
		||||
@@ -204,11 +205,6 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 | 
			
		||||
 | 
			
		||||
    @quote.status = status
 | 
			
		||||
    @quote.save
 | 
			
		||||
 | 
			
		||||
    embedded_quote = safe_prefetched_embed(@account, @status_parser.quoted_object, @json['context'])
 | 
			
		||||
    ActivityPub::VerifyQuoteService.new.call(@quote, fetchable_quoted_uri: @quote_uri, prefetched_quoted_object: embedded_quote, request_id: @options[:request_id], depth: @options[:depth])
 | 
			
		||||
  rescue Mastodon::RecursionLimitExceededError, Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS
 | 
			
		||||
    ActivityPub::RefetchAndVerifyQuoteWorker.perform_in(rand(30..600).seconds, @quote.id, @quote_uri, { 'request_id' => @options[:request_id] })
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def process_tags
 | 
			
		||||
@@ -378,6 +374,15 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 | 
			
		||||
    Rails.logger.warn "Error fetching replies: #{e}"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def fetch_and_verify_quote
 | 
			
		||||
    return if @quote.nil?
 | 
			
		||||
 | 
			
		||||
    embedded_quote = safe_prefetched_embed(@account, @status_parser.quoted_object, @json['context'])
 | 
			
		||||
    ActivityPub::VerifyQuoteService.new.call(@quote, fetchable_quoted_uri: @quote_uri, prefetched_quoted_object: embedded_quote, request_id: @options[:request_id], depth: @options[:depth])
 | 
			
		||||
  rescue Mastodon::RecursionLimitExceededError, Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS
 | 
			
		||||
    ActivityPub::RefetchAndVerifyQuoteWorker.perform_in(rand(30..600).seconds, @quote.id, @quote_uri, { 'request_id' => @options[:request_id] })
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def conversation_from_uri(uri)
 | 
			
		||||
    return nil if uri.nil?
 | 
			
		||||
    return Conversation.find_by(id: OStatus::TagManager.instance.unique_tag_to_local_id(uri, 'Conversation')) if OStatus::TagManager.instance.local_id?(uri)
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
 | 
			
		||||
    @poll_changed              = false
 | 
			
		||||
    @quote_changed             = false
 | 
			
		||||
    @request_id                = request_id
 | 
			
		||||
    @quote                     = nil
 | 
			
		||||
 | 
			
		||||
    # Only native types can be updated at the moment
 | 
			
		||||
    return @status if !expected_type? || already_updated_more_recently?
 | 
			
		||||
@@ -49,6 +50,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
 | 
			
		||||
        create_edits!
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      fetch_and_verify_quote!(@quote, @status_parser.quote_uri) if @quote.present?
 | 
			
		||||
      download_media_files!
 | 
			
		||||
      queue_poll_notifications!
 | 
			
		||||
 | 
			
		||||
@@ -310,10 +312,10 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
 | 
			
		||||
        @quote_changed = true
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      @quote = quote
 | 
			
		||||
      quote.save
 | 
			
		||||
 | 
			
		||||
      fetch_and_verify_quote!(quote, quote_uri)
 | 
			
		||||
    elsif @status.quote.present?
 | 
			
		||||
      @quote = nil
 | 
			
		||||
      @status.quote.destroy!
 | 
			
		||||
      @quote_changed = true
 | 
			
		||||
    end
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user