Сбой Silent ruby ​​/ rails приводит к тому, что он потребляет всю память и приводит к сбою сервера. - PullRequest
3 голосов
/ 16 марта 2012

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

class ApplicationController < ActionController::Base
  before_filter :set_timezone

  def set_timezone
    if logged_in?
      Time.zone = current_user.time_zone
    end
  end

Когда PayPal пытается отправить уведомление, оно приходит примерно так:

Started POST "/ipn_subscription_notifications" for 173.0.82.126 at 2012-03-15 04:11:45 -0400
  Processing by IpnSubscriptionNotificationsController#create as HTML
  Parameters: {"txn_type"=>"subscr_signup", etc...

И здесь оно зависает.Руби начинает жевать память, пока машина не сломается.Это исправление:

def set_timezone
  if current_user
    Time.zone = current_user.time_zone
  end
end

Давайте посмотрим на logged_in?:

module AuthenticatedSystem
  def logged_in?
    current_user ? true : false
  end

, что логически эквивалентно исправлению.

Я подозреваю, что происходит ошибкаброшен и пойман, и кто-то перезапускает процесс запроса.AuthenticatedSystem несомненно подозрительно.

Этого не происходит в среде разработки, он выдает ошибку и возвращает 500:

Started POST "/ipn_subscription_notifications" for 127.0.0.1 at 2012-03-15 15:19:39 -0700
  Processing by IpnSubscriptionNotificationsController#create as */*
  Parameters: {"foobar"=>nil}
Completed 500 Internal Server Error in 9ms

NoMethodError (undefined method `logged_in?' for #<IpnSubscriptionNotificationsController:0xdfdaaf4>):
  app/controllers/application_controller.rb:8:in `set_timezone'

Rendered /usr/local/rvm/gems/ruby-1.9.2-p180@ce2/gems/actionpack-3.1.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.3ms)
Rendered /usr/local/rvm/gems/ruby-1.9.2-p180@ce2/gems/actionpack-3.1.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.0ms)
Rendered /usr/local/rvm/gems/ruby-1.9.2-p180@ce2/gems/actionpack-3.1.0/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (4.8ms)
[2012-03-15 15:19:40] ERROR Errno::ECONNRESET: Connection reset by peer
  /usr/local/rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/webrick/httpserver.rb:56:in `eof?'
  /usr/local/rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/webrick/httpserver.rb:56:in `run'
  /usr/local/rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/webrick/server.rb:183:in `block in start_thread'

Моя цель - обнаружение таких сбоев и их корректная обработка.

Есть идеи?Могу ли я использовать инструмент Passenger или какую-либо другую часть стека Rails?

Ответы [ 2 ]

0 голосов
/ 06 июня 2013

Может быть, это не решит вашу проблему, но вы должны использовать around_filter: set_timezone вместо фильтра before.Взгляните на это: http://www.elabs.se/blog/36-working-with-time-zones-in-ruby-on-rails#working_with_multiple_user_time_zones

0 голосов
/ 31 мая 2012

ошибка не определена методом logged_in?в вашем IpnSubscriptionNotificationsController, и этот контроллер наследует от ApplicationController, вы обязательно включите модуль AuthenticatedSystem в ваш ApplicationController, может быть, вы можете попробовать это сначала

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...