mysql - ActiveRecord:: कनेक्शनटाइमआउट त्रुटि: 5.000 सेकंड के भीतर डेटाबेस कनेक्शन प्राप्त नहीं कर सका(प्रतीक्षा 5.000 सेकंड)




ruby-on-rails nginx (2)

मेरे पास उत्पादन में रेल ऐप है कि मैंने दूसरे दिन कुछ बदलाव तैनात किए। अचानक अचानक मुझे त्रुटि मिलती है ActiveRecord::ConnectionTimeoutError: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds) दिन में कई बार ActiveRecord::ConnectionTimeoutError: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds) और समस्या को ठीक करने के लिए प्यूमा को पुनरारंभ करना होगा।

मैं पूरी तरह से फंस गया हूं कि इसका कारण क्या है। मैंने अपने सर्वर पर कुछ भी नहीं बदला और मेरे द्वारा किए गए परिवर्तन बहुत ही सरल थे (एक दृश्य में जोड़ें और नियंत्रक विधि में जोड़ें)।

मैं लॉग फ़ाइलों में कुछ भी नहीं देख रहा हूँ।

मैं रेल 4.1.4 और रूबी 2.0.0p481 का उपयोग कर रहा हूँ

मेरे कनेक्शन क्यों भर रहे हैं के बारे में कोई विचार? मेरा कनेक्शन पूल 10 पर सेट है और मैं डिफ़ॉल्ट प्यूमा कॉन्फ़िगरेशन का उपयोग कर रहा हूं।

यहां एक स्टैक ट्रेस है:

ActiveRecord::ConnectionTimeoutError (could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)):
  activerecord (4.1.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:190:in `block in wait_poll'
  activerecord (4.1.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:181:in `loop'
  activerecord (4.1.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:181:in `wait_poll'
  activerecord (4.1.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:136:in `block in poll'
  /usr/local/rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize'
  activerecord (4.1.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:146:in `synchronize'
  activerecord (4.1.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:134:in `poll'
  activerecord (4.1.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:418:in `acquire_connection'
  activerecord (4.1.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:351:in `block in checkout'
  /usr/local/rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize'
  activerecord (4.1.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:350:in `checkout'
  activerecord (4.1.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:265:in `block in connection'
  /usr/local/rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize'
  activerecord (4.1.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:264:in `connection'
  activerecord (4.1.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:541:in `retrieve_connection'
  activerecord (4.1.4) lib/active_record/connection_handling.rb:113:in `retrieve_connection'
  activerecord (4.1.4) lib/active_record/connection_handling.rb:87:in `connection'
  activerecord (4.1.4) lib/active_record/query_cache.rb:51:in `restore_query_cache_settings'
  activerecord (4.1.4) lib/active_record/query_cache.rb:43:in `rescue in call'
  activerecord (4.1.4) lib/active_record/query_cache.rb:32:in `call'
  activerecord (4.1.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:621:in `call'
  actionpack (4.1.4) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
  activesupport (4.1.4) lib/active_support/callbacks.rb:82:in `run_callbacks'
  actionpack (4.1.4) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
  actionpack (4.1.4) lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
  airbrake (4.1.0) lib/airbrake/rails/middleware.rb:13:in `call'
  actionpack (4.1.4) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
  actionpack (4.1.4) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.1.4) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.1.4) lib/rails/rack/logger.rb:20:in `block in call'
  activesupport (4.1.4) lib/active_support/tagged_logging.rb:68:in `block in tagged'
  activesupport (4.1.4) lib/active_support/tagged_logging.rb:26:in `tagged'
  activesupport (4.1.4) lib/active_support/tagged_logging.rb:68:in `tagged'
  railties (4.1.4) lib/rails/rack/logger.rb:20:in `call'
  actionpack (4.1.4) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
  dragonfly (1.0.5) lib/dragonfly/cookie_monster.rb:9:in `call'
  rack (1.5.2) lib/rack/runtime.rb:17:in `call'
  activesupport (4.1.4) lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call'
  rack (1.5.2) lib/rack/sendfile.rb:112:in `call'
  airbrake (4.1.0) lib/airbrake/user_informer.rb:16:in `_call'
  airbrake (4.1.0) lib/airbrake/user_informer.rb:12:in `call'
  railties (4.1.4) lib/rails/engine.rb:514:in `call'
  railties (4.1.4) lib/rails/application.rb:144:in `call'
  railties (4.1.4) lib/rails/railtie.rb:194:in `public_send'
  railties (4.1.4) lib/rails/railtie.rb:194:in `method_missing'
  puma (2.9.0) lib/puma/configuration.rb:71:in `call'
  puma (2.9.0) lib/puma/server.rb:490:in `handle_request'
  puma (2.9.0) lib/puma/server.rb:361:in `process_client'
  puma (2.9.0) lib/puma/server.rb:254:in `block in run'
  puma (2.9.0) lib/puma/thread_pool.rb:92:in `call'
  puma (2.9.0) lib/puma/thread_pool.rb:92:in `block in spawn_thread'

Puma init.d स्क्रिप्ट

#!/bin/sh
# Starts and stops puma
#


case "$1" in
        start)
                su myuser -c  "source /etc/profile && cd /var/www/myapp/current && rvm gemset use myapp && puma -d -e production -b unix:///var/www/myapp/myapp_app.sock -S /var/www/myapp/myapp_app.state"
        ;;

        stop)
                su myuser -c "source /etc/profile && cd /var/www/myapp/current &&  rvm gemset use myapp && RAILS_ENV=production bundle exec pumactl -S /var/www/myapp/myapp_app.state stop"
        ;;

        restart)
                $0 stop
                $0 start
        ;;

        *)
                echo "Usage: $0 {start|stop|restart}"
                exit 1
esac

संपादित करें

मुझे लगता है कि मैंने आखिरकार user_signed_in? मणि के साथ इस मुद्दे को कम कर दिया है और devise method current_user या user_signed_in? का उपयोग कर user_signed_in? before_action में application_controller.rb में।

यहां मेरा एप्लिकेशन नियंत्रक है:

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :authenticate_user!, :get_new_messages 

  # Gets the unread messages for the logged in user
  def get_new_messages
    @num_new_messages = 0 # Initially set to 0 so login page, etc works
    # If the user is signed in, fetch the new messages
    if user_signed_in? # I also tried !current_user.nil?
      @num_new_messages = Message.where(:created_for => current_user.id).where(:viewed => false).count
    end
  end

...
end

अगर मैं ब्लॉक को हटा देता हूं, तो मुझे कोई समस्या नहीं है। चूंकि मैंने उस कोड को पेश किया है, इसलिए मेरा ऐप कनेक्शन से बाहर निकलता प्रतीत होता है। अगर मैं इसे छोड़ देता हूं और एयरब्रैक मणि को हटा देता हूं, तो मेरा ऐप मेरे database.yml पर मेरे पूल पर सेट किए गए केवल डिफ़ॉल्ट 5 कनेक्शन के साथ ठीक है।

संपादित करें

मैं अंततः यह config.exceptions_app = self.routes हूं कि अगर मैं इस config/environments/production.rb config.exceptions_app = self.routes फ़ाइल config.exceptions_app = self.routes में इस पंक्ति को टिप्पणी करता हूं कि मुझे त्रुटि नहीं मिलती है। ऐसा लगता है कि ऐप नियंत्रक में कस्टम मार्ग + devise पहले कारण हैं। मैंने जिथब पर एक मुद्दा और पुनरुत्पादन योग्य परियोजना बनाई है।

https://github.com/plataformatec/devise/issues/3422 https://github.com/toymachiner62/devise-connection-failure/blob/master/config/environments/production.rb#L84 https://github.com/plataformatec/devise/issues/3422 https://github.com/toymachiner62/devise-connection-failure/blob/master/config/environments/production.rb#L84 https://github.com/plataformatec/devise/issues/3422 https://github.com/toymachiner62/devise-connection-failure/blob/master/config/environments/production.rb#L84


आखिरकार इस मुद्दे ने मुझे एक और साल या उससे भी ज्यादा परेशान किया। अंत में मुझे प्यूमा लोगों के साथ काम करने का अच्छा समाधान मिला।

अपने प्यूमा को कम से कम 2.15.x पर अपग्रेड करें।


देवताओं की मदद से मुझे लगता है कि मुझे अंत में यह मुद्दा पता चला। ऐसा लगता है कि अपने स्वयं के नियंत्रक के साथ कस्टम त्रुटि पृष्ठों का उपयोग करके, मैं get_action get_new_messages छोड़ नहीं रहा था। तो बहुत आसान फिक्स जोड़ना था:

skip_before_filter :get_new_messages

मेरे कस्टम त्रुटि नियंत्रक के लिए।

यह समस्या विस्तार से बताती है कि इसके पीछे कारण: https://github.com/plataformatec/devise/issues/3422