2012-03-26 8 views
10

Mysql2::Error: MySQL server has gone awayエラーのために、delayed_jobプロセスが特定の状況で停止するシナリオをデバッグしようとしています。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がdbから成功したタスクを削除しようとしましたが、mysql接続が切断されているため、これを実行できませんでした。これは、ClustalwFlowTask#runコード内のreturn falseステートメントの後に発生します。遅延されたジョブに従って、タスクが正常に終了するからです。

開発・ログには、これを持っている:

================ 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はまだ、これらのイベントの後に実行しているdatabase.ymlのにreconnect: trueを追加してみてください?問題は再現性があり、散発的ですか?あなたはサーバー上のmysqlログをチェックしましたか?サーバーに十分なメモリがありますか?また、回答とこの関連する質問にリンクを確認してください:http://stackoverflow.com/questions/6807012/mysql2-error-mysql-server-has-gone-away –

+0

はい、mysqlサーバーはまだ実行されています。イベントは、私が記述したのと同じ状況下で常に再現可能です。 mysqlログにはエラーは表示されません。私は "サーバーがなくなってしまった"というエラーの原因のリストを見てきましたが、ここには何も適用されないようです。 –

+0

@AndreaSingh、この問題の解決策を見つけましたか?私は正確な問題に直面しています。私は再接続を試みました:本当ですが、どちらもうまくいきませんでした。 –

答えて

9

+0

かなりの時間これを見ていた。これで私はすぐに固定されました。 Rails 3.2.7 –

関連する問題