2012-03-26 59 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