如何在/ action_dispatch / middleware / reloader"中查找/修复" stackoverflow异常?

时间:2018-01-29 18:04:10

标签: ruby-on-rails-3

我在我的制作debian / rails 3.2.22.5上得到了这个例外零星的

编辑:我知道也可以在开发中重现它

感觉它与缓存有关。

我有一个" permission_checker"几乎每次调用服务器都称为宽度。它检查所请求对象的权限 - 关闭所有记录/模型,直到找到该对象/记录的最终所有者,然后决定:

when no owner found then 404
when owner found same as logged in user then process page
when owner found is the public owner then process page read only
else raise permission exception

到目前为止一切顺利

代码看起来像那样(' aaa'等等和调整级错误)

# some processing to find the owner
# id_val is a hash holding the result of this

logger.error "needed owner id :#{id_val}".yellow

logger.error "aaa".yellow
needed_owner_id=id_val[:person_id]
if needed_owner_id
    logger.error "bbb  #{needed_owner_id}".yellow
    needed_owner=Person.find(needed_owner_id)  #<----- here is the crash
    logger.error "ccc".yellow
    logger.error "needed owner id :#{needed_owner_id} (#{needed_owner.owner_type}".red.on_white
    logger.error "ddd".yellow
    logger.error "current person id :#{@current_person ? @current_person.id : nil}".red.on_white
else
    logger.error "no needed owner found"
end

# further processing

如果我没有得到堆栈溢出,输出如下:

Started GET "/ldc/order_forms/ec0a08a6-8525-4c6e-9056-d387e7ad3b9c/edit" 
Processing by Ldc::OrderFormsController#edit as HTML
  Parameters: {"id"=>"ec0a08a6-8525-4c6e-9056-d387e7ad3b9c"}
  LoginData Load (0.1ms)  SELECT `login_data`.* FROM `login_data` WHERE `login_data`.`id` = '083a684f-db0e-4c87-a44e-d434d3334289' LIMIT 1
  Ldc::Person Load (0.1ms)  SELECT `ldc_people`.* FROM `ldc_people` WHERE `ldc_people`.`ustate` = 'A' AND `ldc_people`.`login_data_id` = '083a684f-db0e-4c87-a44e-d434d3334289' LIMIT 1
check in: {:order_form_id=>"ec0a08a6-8525-4c6e-9056-d387e7ad3b9c", :person_id=>nil}
  Ldc::OrderForm Load (0.1ms)  SELECT `ldc_order_forms`.* FROM `ldc_order_forms` WHERE `ldc_order_forms`.`ustate` = 'A' AND `ldc_order_forms`.`id` = 'ec0a08a6-8525-4c6e-9056-d387e7ad3b9c' LIMIT 1
  CACHE (0.0ms)  SELECT `ldc_order_forms`.* FROM `ldc_order_forms` WHERE `ldc_order_forms`.`ustate` = 'A' AND `ldc_order_forms`.`id` = 'ec0a08a6-8525-4c6e-9056-d387e7ad3b9c' LIMIT 1
needed owner id :{:person_id=>"c7285c28-0906-4592-bbd7-3fbe164a337e"}
aaa
bbb  c7285c28-0906-4592-bbd7-3fbe164a337e
  Ldc::Person Load (0.1ms)  SELECT `ldc_people`.* FROM `ldc_people` WHERE `ldc_people`.`ustate` = 'A' AND `ldc_people`.`id` = 'c7285c28-0906-4592-bbd7-3fbe164a337e' LIMIT 1
ccc
needed owner id :c7285c28-0906-4592-bbd7-3fbe164a337e
ddd
current person id :c7285c28-0906-4592-bbd7-3fbe164a337e
--------- permission check done ---------

如果失败那么直到崩溃都是一样的:

check in: {:order_form_id=>"ec0a08a6-8525-4c6e-9056-d387e7ad3b9c", :person_id=>nil}
  Ldc::OrderForm Load (3.2ms)  SELECT `ldc_order_forms`.* FROM `ldc_order_forms` WHERE `ldc_order_forms`.`ustate` = 'A' AND `ldc_order_forms`.`id` = 'ec0a08a6-8525-4c6e-9056-d387e7ad3b9c' LIMIT 1
  CACHE (0.0ms)  SELECT `ldc_order_forms`.* FROM `ldc_order_forms` WHERE `ldc_order_forms`.`ustate` = 'A' AND `ldc_order_forms`.`id` = 'ec0a08a6-8525-4c6e-9056-d387e7ad3b9c' LIMIT 1
needed owner id :{:person_id=>"c7285c28-0906-4592-bbd7-3fbe164a337e"}
aaa
bbb  c7285c28-0906-4592-bbd7-3fbe164a337e
Completed 500 Internal Server Error in 223.8ms

SystemStackError (stack level too deep):
  actionpack (3.2.22.5) lib/action_dispatch/middleware/reloader.rb:70

lib / action_dispatch / middleware / reloader.rb:70的代码是加注:

def call(env)
  @validated = @condition.call
  prepare!
  response = @app.call(env)
  response[2] = ActionDispatch::BodyProxy.new(response[2]) { cleanup! }
  response
rescue Exception
  cleanup!
  raise
end

这些线路有什么想法,所以我可以进一步搜索?

0 个答案:

没有答案