2012-03-26 56 views
10

我试图调试delayed_job进程由于Mysql2::Error: MySQL server has gone away错误而在某些情况下死亡的情况。MySQL服务器在delayed_job任务中消失了错误

我的设置有点复杂,但我试图将它简化为基础。 ClustalwFlowTask类中的run方法作为后台作业处理。它基本上运行clustalw2命令(一个程序,它为DNA和蛋白质的多序列比对)

该命令,并出现在其执行应该在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二进制,即如果该方法标准错误变量不是空白。请注意,在调试过程中,我没有注释来自#run方法的所有update_attribute语句,因此没有明显的MySQL参与。 (我的一个第一预感是标准错误消息是太大或包含的东西,使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试图从数据库中删除一个成功的任务,但无法这样做,因为mysql连接已被切断。这发生在ClustalwFlowTask#run代码中的return false语句之后,因为根据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 

我跑出来的关于如何调试这个想法,所以任何帮助,将不胜感激。

+0

是MySQL的还是这些事件后运行?问题是可重现的还是零星的?你检查过服务器上的mysql日志吗?服务器上有足够的内存吗?也检查答案和链接在这个相关的SO问题:http://stackoverflow.com/questions/6807012/mysql2-error-mysql-server-has-gone-away – 2012-03-26 19:17:14

+0

是的,MySQL服务器仍在运行。在我描述的相同情况下,事件总是可重现的。 mysql日志不显示任何错误。我已经看到了“服务器已经消失”错误的可能原因列表,但似乎没有什么适用于此。 – 2012-03-27 04:21:31

+0

@AndreaSingh,你找到了解决这个问题的方法吗?我正面临着确切的问题。我尝试重新连接:真的,但也没有工作。 – 2016-07-06 09:47:48

回答

9

尝试增加reconnect: true到您的database.yml

+0

很长一段时间看着这个。这固定了我。 Rails 3.2.7 – 2013-03-26 14:49:08