Jruby / Resque: сетевые подключения из задания восстановления начинают повторяться сбои - PullRequest
1 голос
/ 06 сентября 2011

У меня странная проблема с заданием resque, и мне интересно, сталкивался ли кто-нибудь еще.

Мы запускаем resque под jruby 1.6.2

У нас есть long запущенная задача, которая загружает кучу файлов с различных URL-адресов, загружает эти файлы в Rackspace Cloudfiles с помощью Fog, а затем сохраняет некоторую информацию об этих файлах в MySQL.После того, как это продолжалось некоторое время, кажется, что сетевой стек нашего приложения падает.В одном случае, первым признаком сбоя был тайм-аут отсюда:

org/jruby/ext/openssl/SSLSocket.java:512:in `sysread'
/var/www/lisausa/shared/bundle/jruby/1.9/gems/jruby-openssl-0.7.4/lib/openssl/buffering.rb:35:in `fill_rbuff'
/var/www/lisausa/shared/bundle/jruby/1.9/gems/jruby-openssl-0.7.4/lib/openssl/buffering.rb:158:in `eof?'
/var/www/lisausa/shared/bundle/jruby/1.9/gems/jruby-openssl-0.7.4/lib/openssl/buffering.rb:133:in `readline'
/var/www/lisausa/shared/bundle/jruby/1.9/gems/excon-0.6.5/lib/excon/response.rb:22:in `parse'
/var/www/lisausa/shared/bundle/jruby/1.9/gems/excon-0.6.5/lib/excon/connection.rb:174:in `request'
/var/www/lisausa/shared/bundle/jruby/1.9/gems/fog-0.11.0/lib/fog/core/connection.rb:20:in `request'
/var/www/lisausa/shared/bundle/jruby/1.9/gems/fog-0.11.0/lib/fog/storage/rackspace.rb:107:in `request'

Обычно мы видим, что эти проблемы появляются примерно через 10-15 минут после запуска задания.После этого мы начинаем видеть это при каждой последующей попытке записи в базу данных ...

ActiveRecord::JDBCError: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.: SELECT `bills`.* FROM `bills` WHERE (`bills`.state_session_id = 59)
ActiveRecord::StatementInvalid: ActiveRecord::JDBCError: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.: SELECT `bills`.* FROM `bills` WHERE (`bills`.state_session_id = 59)
/var/www/lisausa/shared/bundle/jruby/1.9/gems/activerecord-3.0.10/lib/active_record/connection_adapters/abstract_adapter.rb:207:in `log'
/var/www/lisausa/shared/bundle/jruby/1.9/gems/activerecord-3.0.10/lib/active_record/connection_adapters/abstract_adapter.rb:200:in `log'
/var/www/lisausa/shared/bundle/jruby/1.9/gems/activerecord-jdbc-adapter-1.1.1/lib/arjdbc/jdbc/adapter.rb:183:in `execute'
/var/www/lisausa/shared/bundle/jruby/1.9/gems/activerecord-jdbc-adapter-1.1.1/lib/arjdbc/jdbc/adapter.rb:275:in `select'
/var/www/lisausa/shared/bundle/jruby/1.9/gems/activerecord-3.0.10/lib/active_record/connection_adapters/abstract/database_statements.rb:7:in `select_all'
/var/www/lisausa/shared/bundle/jruby/1.9/gems/activerecord-3.0.10/lib/active_record/connection_adapters/abstract/query_cache.rb:56:in `select_all'
/var/www/lisausa/shared/bundle/jruby/1.9/gems/activerecord-3.0.10/lib/active_record/base.rb:473:in `find_by_sql'
/var/www/lisausa/shared/bundle/jruby/1.9/gems/activerecord-3.0.10/lib/active_record/relation.rb:64:in `to_a'
/var/www/lisausa/shared/bundle/jruby/1.9/gems/activerecord-3.0.10/lib/active_record/relation/finder_methods.rb:143:in `all'

Я пытался использовать гем ruby-cloudfiles вместо Fog, но мы, похоже, начинаем сталкиваться сточно такие же ошибки в конечном итоге, используя эту комбинацию тоже.Если я отключу загрузку файла / загрузку облачных файлов, эти ошибки никогда не появятся, и я смог оставить эту конкретную работу в течение нескольких дней.

Любые теории о том, что может происходить здесь

1 Ответ

0 голосов
/ 26 апреля 2012

Для чего это стоит, месяцы спустя, я могу вам сказать, что

"ActiveRecord :: JDBCError: Невозможно прочитать ответ с сервера. Предполагается, что нужно прочитать 4 байта, прочитайте 0 байтов, прежде чем соединение было неожиданно потеряно ..."

обычно является для нас показателем того, что соединение с базой данных было разорвано (либо из-за проблем с сетью, либо из-за сбоя БД, и т. Д.) И закрытый сокет. По крайней мере, для нас поведение по умолчанию JRuby / ActiveRecord / ConnectionPool состоит в том, чтобы продолжать взрываться с этой ошибкой в ​​каждой команде вместо повторного соединения.

...