RuntimeError:无法在Rack

时间:2017-12-12 08:54:40

标签: ruby-on-rails sinatra rack puma

我构建了一个非常小的Rails 5.1.4(Ruby 2.3.1)应用程序。一旦我将其部署到生产环境中,我就会不时收到此特定错误:

RuntimeError: can't add a new key into hash during iteration

指向此处:

# rack/request.rb, line 67
def set_header(name, v)
  @env[name] = v
end

我理解,当您在迭代该哈希时尝试向哈希添加新密钥时会发生此错误。由于@env是哈希,因此它是有道理的。但是:

  1. 在一个堆栈跟踪中,我发现与@env上的迭代没有任何关系,它是一个简单的app.call(env)调用链。
  2. 这个错误并不总是发生,但每小时或两次只发生一次,所以这对我来说也很奇怪
  3. 我无法在本地重现它:我尝试加载具有多个请求命中的服务器,假设这可能是线程安全问题,但在本地它就像一个魅力......
  4. 完整的堆栈跟踪只包含机架中间件,可以在这里找到: https://gist.github.com/Nattfodd/e513122400b4115a653ea38d69917a9a

    Gemfile.lock的: https://gist.github.com/Nattfodd/a9015e9204544302bf3959cec466b715

    服务器正在使用puma运行,配置非常简单:只是线程和工作量:

    threads 0, 5
    workers 5
    

    我目前的想法是:

    • 其中一个监控宝石有一个bug(sentry-raven,new_relic)
    • concurrent-ruby有一个bug(我读了一个,但它在1.0.2中得到修复,而我用于Puma的实际版本是1.0.5)
    • 超级愚蠢的东西,我错过了,但我不知道在哪里看,因为控制器的动作包含3行代码,而应用程序配置主要是默认...
    • 这与配置相关,因为回溯根本不包含控制器......

1 个答案:

答案 0 :(得分:0)

你可以粘贴完整的堆栈跟踪吗? 我的假设是从迭代环境的方法调用set_header。