Сервер MySQL ушел с ошибкой в ​​задаче delayed_job

Я пытаюсь отлаживать сценарий, в котором процесс delayed_job умирает при определенных обстоятельствах из-за ошибки Mysql2::Error: MySQL server has gone away.

Моя настройка немного сложна, но я попытался свести ее к основам. Метод run в классе ClustalwFlowTask обрабатывается как фоновое задание. Он в основном запускает команду clustalw2 (программа, которая выполняет множественное выравнивание последовательностей для ДНК и белков)

Детали команды и любые ошибки, возникающие во время ее выполнения, должны регистрироваться в таблице flow_tasks и не попадать в delayed_job (см. инструкции update_attribute).

require 'open3'
class ClustalwFlowTask < FlowTask

  def run
    # setup code ------

    # fasta is a file object
    cmd = "clustalw2 -INFILE=#{fasta.path}"

    Rails.logger.info "[INFO #{Time.now}] #{self} running #{cmd}"
    #update_attribute(:command, cmd)

    raw_stdin,  raw_stdout, raw_stderr = Open3.popen3(cmd)

    Rails.logger.info "*********** RAW STDERR: #{raw_stderr} ************"

    stdin, stdout, stderr = [raw_stdin,  raw_stdout, raw_stderr].map do |io|
      s = io.read.strip rescue nil
      io.close
      s
    end

    Rails.logger.info "*************** #{stderr} *******************"
    unless stderr.blank?
      Rails.logger.info "============  THERE IS AN ERROR  ============"
      #update_attribute(:error, stderr)
      return false
    end

    # more code here -----
end

Странное поведение начинается, когда у пользователя нет установленного двоичного файла clustalw2, то есть если переменная stderr в методе не пуста. Обратите внимание, что во время отладки я раскомментировал все операторы update_attribute метода #run, поэтому явное участие MySQL не имеет. (Одна из моих первых попыток заключалась в том, что сообщение stderr слишком велико или содержит что-то, что заставляет сервер MySQL закрываться, но это, похоже, не так)

Журнал delayed_job содержит следующее:

2012-03-26T09:19:25-0700: [Worker(delayed_job host:JadeDragon.local pid:8998)] ClustalwFlowTask failed with ActiveRecord::StatementInvalid: Mysql2::Error: closed MySQL connection: DELETE FROM `delayed_jobs` WHERE `delayed_jobs`.`id` = 107 - 0 failed attempts

Кажется, что здесь происходит, что delayed_job попытался удалить успешную задачу из db, но не смог этого сделать, потому что соединение mysql было отключено. Это происходит после инструкции return false в коде ClustalwFlowTask#run, так как это, когда, по словам delayed_job, задача завершена успешно.

В журнале разработки есть следующее:

================  THERE IS AN ERROR  ================
   (0.5ms)  BEGIN
Mysql2::Error: MySQL server has gone away: BEGIN
  SQL (0.2ms)  DELETE FROM `delayed_jobs` WHERE `delayed_jobs`.`id` = 110
Mysql2::Error: closed MySQL connection: DELETE FROM `delayed_jobs` WHERE `delayed_jobs`.`id` = 110
   (0.1ms)  ROLLBACK
Mysql2::Error: closed MySQL connection: ROLLBACK
   (0.1ms)  BEGIN
Mysql2::Error: closed MySQL connection: BEGIN
   (0.1ms)  ROLLBACK
Mysql2::Error: closed MySQL connection: ROLLBACK
closed MySQL connection

У меня заканчиваются идеи о том, как отлаживать это, поэтому любая помощь будет принята с благодарностью.

Ответ 1

Попробуйте добавить reconnect: true в ваш database.yml