2012-03-26 13 views
10

Mysql2::Error: MySQL server has gone away hatası nedeniyle delayed_job işleminin belirli koşullar altında öldüğü bir senaryoda hata ayıklamaya çalışıyorum.MySQL sunucusu, delayed_job görevinde hatadan kalktı

Kurmam biraz karmaşıktır, ancak bunları temel konulara ayırmaya çalıştım. ClustalwFlowTask sınıfındaki run yönteminin arka plan işi olarak ele alınır. Temel olarak bir clustalw2 komutunu çalıştırır (DNA ve proteinler için çoklu dizi hizalaması yapan bir program)

Komutun ayrıntıları ve yürütülmesi sırasında ortaya çıkan herhangi bir hata, flow_tasks tablosuna kaydedilmeli ve delayed_job tarafından yakalanmamalıdır (bkz. update_attribute ifadeleri). Bir kullanıcı clustalw2 ikili yüklü olmadığında

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 

garip davranış yönteminde Stderr değişken boş değilse, yani başlatır. Hata ayıklama sırasında #run yönteminin tüm update_attribute ifadeleri uncommented unutmayın, bu nedenle görünür MySQL katılımı yoktur. (Benim ilk önsezilere biri Stderr mesajı çok büyük veya kapatmaya MySQL sunucu neden bir şey içerdiğini, ama bu durum görünmüyor)

delayed_job günlüğü aşağıdakileri içerir:

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 

Burada olup bitmiş gibi görünen bir durumdur, gecikmiş_job db'den başarılı bir görevi silmeyi denedi, ancak bunu yapamadı çünkü mysql bağlantısı kesildi. Bu, ClustalwFlowTask#run kodundaki return false ifadesinden sonra gerçekleşir, çünkü o zaman, delayed_job öğesine göre, görev başarıyla tamamlanır.

geliştirme günlüğü bu sahiptir:

================ 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 

ben bu hata ayıklamak için nasıl fikirleri tükeniyor, bu yüzden herhangi bir yardım büyük mutluluk duyacağız.

+0

MySQL yine de bu olaylardan sonra mı çalışıyor senin database.yml için reconnect: true ekleyerek deneyin? Sorun tekrarlanabilir mi, yoksa dağınık mı? Sunucudaki mysql günlüklerini kontrol ettiniz mi? Sunucuda yeterli bellek var mı? Ayrıca, bu SO soruyla ilgili cevapları ve bağlantıyı kontrol edin: http://stackoverflow.com/questions/6807012/mysql2-error-mysql-server-has-gone-away –

+0

Evet, mysql sunucusu hala çalışıyor. Olay, her zaman anlattığım aynı koşullar altında tekrarlanabilir. Mysql günlükleri herhangi bir hata göstermiyor. "Sunucu gitti" hatası için olası nedenlerin listesini gördüm, ancak hiçbir şey burada uygulanabilir gibi görünüyor. –

+0

@AndreaSingh, Bu soruna bir çözüm buldunuz mu? Tam problemle karşı karşıyayım. Yeniden bağlanmayı denedim: doğru ama bu da işe yaramadı. –

cevap

9

+0

Uzun bir süredir buna bakıyordum. Bu beni düzeltdi. Raylar 3.2.7 –

İlgili konular