2012-03-26 8 views
10

मैं एक परिदृश्य को डीबग करने की कोशिश कर रहा हूं जिसमें Mysql2::Error: MySQL server has gone away त्रुटि के कारण देरी_job प्रक्रिया कुछ परिस्थितियों में मर जाती है।MySQL सर्वर देरी_job कार्य में त्रुटि दूर चला गया है

मेरा सेटअप थोड़ा जटिल है, लेकिन मैंने मूलभूत बातें इसे कम करने की कोशिश की। runClustalwFlowTask कक्षा में विधि पृष्ठभूमि कार्य के रूप में संभाला जाता है। यह मूल रूप से एक 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 चर खाली नहीं है। ध्यान दें कि मैंने डिबगिंग के दौरान #run विधि से सभी update_attribute कथनों को अस्वीकार कर दिया है, इसलिए कोई स्पष्ट MySQL भागीदारी नहीं है। (मेरी पहली hunches से एक था कि 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 

ऐसा क्या प्रतीत होता है कि देरी_job ने डीबी से एक सफल कार्य को हटाने का प्रयास किया है, लेकिन ऐसा करने में असमर्थ था क्योंकि MySQL कनेक्शन को तोड़ दिया गया था। यह return false के बाद ClustalwFlowTask#run कोड में कथन के बाद होता है, क्योंकि जब देरी_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 अभी भी इन घटनाओं के बाद चल रहा है करने के लिए reconnect: true जोड़ने का प्रयास करें? क्या समस्या पुनरुत्पादित या स्पोराडिक है? क्या आपने सर्वर पर mysql लॉग की जांच की है? क्या सर्वर पर पर्याप्त स्मृति है? इस संबंधित SO प्रश्न पर उत्तर और लिंक भी देखें: http://stackoverflow.com/questions/6807012/mysql2-error-mysql-server-has-gone-away –

+0

हां, mysql सर्वर अभी भी चल रहा है। घटना हमेशा वर्णित उसी परिस्थितियों में पुन: उत्पन्न होती है। MySQL लॉग्स कोई त्रुटि नहीं दिखाते हैं। मैंने "सर्वर चला गया है" त्रुटि के संभावित कारणों की सूची देखी है, लेकिन यहां कुछ भी लागू नहीं होता है। –

+0

@AndreaSingh, क्या आपको इस समस्या का समाधान मिला? मुझे सही समस्या का सामना करना पड़ रहा है। मैंने फिर से कनेक्ट करने की कोशिश की: सच लेकिन यह भी काम नहीं किया। –

उत्तर

9

अपने database.yml

+0

कुछ समय के लिए यह देख रहा था। यह मुझे ठीक से तय किया। रेल 3.2.7 –

संबंधित मुद्दे