sanger/sequencescape

View on GitHub
app/models/submission/delayed_job_behaviour.rb

Summary

Maintainability
A
0 mins
Test Coverage
F
54%
# frozen_string_literal: true
module Submission::DelayedJobBehaviour
  def default_priority
    configatron.delayed_job.fetch(:submission_process_priority, 0)
  end

  def queue_submission_builder
    # Lower priorities get processed faster. This ensures high priority submissions get processed first.
    Delayed::Job.enqueue SubmissionBuilderJob.new(id), priority: default_priority - priority
  end

  # rubocop:todo Metrics/MethodLength
  def build_batch # rubocop:todo Metrics/AbcSize
    ActiveRecord::Base.transaction { finalize_build! }
  rescue ActiveRecord::StatementInvalid => e
    # If an SQL problems occurs, it's more likely that's it's
    # a one shot one, e.g. timeout , deadlock etc ...
    # So we don't want the submission to fail but the delayed job to
    # retry later. Therefore the DelayedJob should fail
    raise e
  rescue ActiveRecord::RecordInvalid, Submission::ProjectValidation::Error => e
    Rails.logger.error(e.message)
    Rails.logger.error(e.backtrace)
    fail_set_message_and_save(e.message)
  rescue => e
    Rails.logger.error(e.message)
    Rails.logger.error(e.backtrace)
    fail_set_message_and_save("#{e.message}\n#{e.backtrace.join("\n")}")
  end

  # rubocop:enable Metrics/MethodLength

  def finalize_build!
    process!
    ready!
  end

  def fail_set_message_and_save(message)
    fail!
    self.message = message[0..254]
    save(validate: false) # Just in case the cause is it being invalid!
  end
  private :fail_set_message_and_save
end