Rails просматривает самопроизвольно сгорание иваров в ruby ​​1.9 - PullRequest
5 голосов
/ 13 октября 2011

У меня есть веб-приложение Rails 3 / ruby ​​1.9.2. Время от времени - и это может быть только 1 запрос на 100000 - я получаю сообщение об ошибке, которое не могу объяснить.

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

 @swf_object_count||=0
 @swf_object_count+=1

- поднял "NoMethodError: неопределенный метод` + 'для nil: NilClass ". Однако обратите внимание, что ошибки не ограничиваются этим случаем, и эти две строки кода предназначены только для иллюстрации, а не как то, что можно обойти, чтобы «решить» проблему.

Ошибка в принципе не может быть воспроизведена: я никогда не видел ее сам, только видел сообщения об ошибках, вытекающих из нее. Я считаю, что ошибка впервые появилась, когда мы переключились с REE на ruby ​​1.9.2.

Разные детали, которые могут иметь или не иметь отношение к делу:

  • Мы запускаем ruby1.9.2p290 в Solaris 10 с использованием разветвленных экземпляров единорога
  • Мы не используем потоки или волокна (исправление: само наше приложение этого не делает, но мы используем NewRelic, у которого есть фоновый поток для сбора / публикации статистики.)
  • У нас есть смесь видов .haml и .erb, но я только когда-либо видел, чтобы это происходило из .haml. (У нас не так много .erbs)
  • Я никогда не видел, чтобы это происходило в коде контроллера
  • Я иногда видел ошибки, связанные с «неопределенным методом« foomethod »для Bar», когда я точно знаю, что мы никогда не вызываем Bar.foomethod. Вполне возможно, что это связано с ошибкой, описанной выше, когда объект Bar самопроизвольно заменил Foo ivar.

Я довольно туп на слежке за этим. Любые предложения, или кто-нибудь видел что-нибудь похожее?

Ответы [ 2 ]

0 голосов
/ 20 октября 2011

Управление представлениями иваров в ваших помощниках - это ужасная идея. Я не уверен, почему у вас возникают проблемы с параллелизмом, но я подозреваю, что они исчезнут, если вы структурируете свой код по-другому.

Возможно, вы можете просто попросить помощника вычислить значения приращения, и, по вашему мнению, сделать что-то вроде

@swf_object_count + swf_increment_helper_value

0 голосов
/ 19 октября 2011

моей первой мыслью были нити или волокна - но вы сказали, что не используете их.хм ... может ли это быть вызвано устаревшей сессией?

это действительно очень широкий и неопределенный вопрос ..

Возможно, вы могли бы написать скрипт для анализа ваших файлов журналов ипопытаться сузить, когда / на каких маршрутах это происходит.Но это также довольно сложно отлаживать, потому что вы, вероятно, внесли несколько изменений кода, некоторые из которых привели к допустимым ошибкам, которые могут выглядеть примерно так.

Может случиться, что экземпляры Unicorn умрут, а затемперезапущен .. это может расстроить текущую сессию.Возможно, вы захотите поэкспериментировать с этим - например, используйте тестовую среду с двумя единорогами, убейте одного посредника и посмотрите, как это повлияет на ваши логи.

Вероятно, вам следует установить средство, где ваши Railsсервер отправляет вам подробную запись в журнале при каждом возникновении исключения ... это, вероятно, лучший способ получить больше информации о том, что там происходит ..

например: этот Gem в вашем Gemfile:

# Receive exception notifications from production
gem 'exception_notification_rails3', :require => 'exception_notifier'

и в вашем файле config / environment / production.rb:

  config.middleware.use ExceptionNotifier,
    :email_prefix => "[Exception] ",
    :sender_address => %{"Exception Notifier" <your-system@your-domain.com>},
    :exception_recipients => %w{person1@your-domain.com person2@your-domain.com}

См. Также: https://github.com/railsware/exception_notification

...