3

После обновления приложения Rails из RestfulAuthentication и Rails 2.3 для разработки и Rails 5.0 мы получаем странные ошибки «401 Unauthorized», а приложение rails зависает по первому запросу:Rails app hangs: Completed 401 Unauthorized in x ms

Completed 401 Unauthorized in x ms 

где x - очень большое число. Ошибка возникает, только если сервер запускается в первый раз (после длительного периода бездействия). Приложение просто зависает и отказывается запускаться, а если мы прерываем сервер, появляются ошибки 401 Unauthorized. Не похоже, чтобы мы использовали Webrick, Puma, Thin или Unicorn. ApplicationController выглядит

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 
    before_action :set_http_headers 
    alias login_required authenticate_user! 
    ... 

(псевдоним был добавлен, чтобы гарантировать плавный переход к Придумайте). Файл конфигурации database.yml выглядит

development: 
    adapter: mysql2 
    encoding: utf8 
    database: db_name 
    pool: 5 
    timeout: 5000 
    username: db_user 
    passwort: 

После того, как приложение работает ошибка исчезает, но если перезагрузить компьютер через несколько часов или на следующий день, ошибка появляется снова. не

Иногда бывает таймаут ошибки как

ActiveRecord::ConnectionTimeoutError: could not obtain a connection from the pool within 5.000 seconds (waited 5.003 seconds); all pooled connections were in use 

или

No live threads left. Deadlock? (fatal) 

соответстующем DEViSE вопросы (here и here) не являются полезными, и ни один из связанных с этим вопросов не предусмотрен решение, ни ActiveRecord::Base.clear_active_connections! помогает, как предложено here или Session.delete_all (сеанс хранится в ActiveRecord). Помогите! Есть идеи?

+0

Это будет очень трудно устранить, не имея доступа к приложению. вы действительно модернизировать от 2,3 до 5,0? в один присест? T купите много других проблем :) Или вы обновлялись с шагом? Тогда между этими версиями это действительно произошло? – Thilo

+0

На самом деле мы создали новое приложение Rails 5, которое подключено к старой базе данных MySQL, и немного изменило его в соответствии с официальными рекомендациями https://github.com/plataformatec/devise/wiki/How-To:-Migrate- from-restful_authentication-to-Devise – 0x4a6f4672

+0

Проблема, скорее всего, в вашем коде, который вы не включили в вопрос. Мы должны убедиться в этом, чтобы иметь возможность диагностировать проблему. Перед тем, как * Завершено 401 Неавторизованная строка x ms * в вашем журнале, должна быть еще одна строка, указывающая, какой контроллер и действие обрабатывают запрос - отправьте код для этого контроллера. Если это происходит в * каждом запросе, отправьте контроллер приложения. – ArtOfCode

ответ

0

Я не знаю, сколько часов эта проблема стоила мне, это действительно раздражает. За последние 8 лет я не встретил ошибку, которая заставила меня так долго разобраться. Это произошло только в среде разработки. Gemfile говорит

group :development do 
    # Spring speeds up development by keeping your application running in the background. 
    # Read more: https://github.com/rails/spring 
    gem 'spring' 
end 

Gemfile.lock говорит пакетирования установил версию 1.7.2 весны. Некоторые люди предлагают stop spring if a rails command hangs. Я прокомментировал весенний камень в Gemfile, удалил жемчужину с gem uninstall spring и обновил менеджер версий Ruby RVM, который я все еще использую, и проблема, которую рельсы зависают при первом запуске, кажется, реже (но она не полностью ушла)

# gem 'spring' 

Это проблема частично spring, возможно, связанная с this issue. Довольно парадоксально, драгоценный камень, который должен ускорить приложение вверх замедляет его, пока он висит :-(

3

Я согласен, это было особенно противным ошибка для меня, что в конечном итоге фик его меняется:.

config.eager_load = false 

к

config.eager_load = true 

в конфигурации/сред/development.rb

+0

Спасибо, я действительно 'config.cache_classes = false' и' config.eager_load = false' в конфиге. Позвольте мне проверить, наконец ли это решит эту неприятную ошибку. 'eager_load = false', если это делает приложение непригодным? – 0x4a6f4672

+0

Я не слишком углублялся в репозиторий Devise, но я предполагаю, что эта ошибка связана с тем, что Devise не имеет доступа к некоторому модулю, который ему нужен, когда он сначала пытается аутентифицировать ел. Таким образом, при выключенном eager_load может быть хорошо для приложения vanilla Rails, похоже, что он создает проблемы в сочетании с Devise. Очевидно, ошибка где-то, но не знаю, где именно. – apod

+0

Нет, к сожалению, это не помогло :-(Ненавижу эту проблему :-( – 0x4a6f4672