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