33 lines
		
	
	
		
			711 B
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			33 lines
		
	
	
		
			711 B
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module Gitlab
 | 
						|
  module Database
 | 
						|
    module QueueErrorHandlingConcern
 | 
						|
      extend ActiveSupport::Concern
 | 
						|
 | 
						|
      MAX_LAST_ERROR_LENGTH = 10_000
 | 
						|
 | 
						|
      included do
 | 
						|
        validates :last_error, length: { maximum: MAX_LAST_ERROR_LENGTH },
 | 
						|
          if: ->(record) { record.respond_to?(:last_error) }
 | 
						|
      end
 | 
						|
 | 
						|
      def handle_exception!(error)
 | 
						|
        transaction do
 | 
						|
          increment!(:attempts)
 | 
						|
          update!(last_error: format_last_error(error))
 | 
						|
        end
 | 
						|
      end
 | 
						|
 | 
						|
      private
 | 
						|
 | 
						|
      def format_last_error(error)
 | 
						|
        [error.message]
 | 
						|
          .concat(error.backtrace)
 | 
						|
          .join("\n")
 | 
						|
          .truncate(MAX_LAST_ERROR_LENGTH)
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |