ruby-on-rails - 运行时错误 : can't add a new key into hash during iteration in Rack

标签 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是一个散列,这是有道理的。但:
  • 在堆栈跟踪中,我没有发现任何与 @env 上的迭代相关的内容。 ,这是一个死的简单链 app.call(env)调用。
  • 这个错误并不总是发生,而是一两个小时一次,所以这对我来说也很奇怪
  • 我无法在本地重现它:我尝试加载多个请求命中的服务器,假设这可能是线程安全问题,但在本地它就像一个魅力......

  • 完整的堆栈跟踪仅包含 Rack 中间件,可在此处找到:
    https://gist.github.com/Nattfodd/e513122400b4115a653ea38d69917a9a

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

    服务器与 puma 一起运行,配置非常简单:只需线程和工作线程的数量:
    threads 0, 5
    workers 5
    

    我目前的想法是:
  • 监控 gem 之一有一个错误(哨兵乌鸦,new_relic)
  • concurrent-ruby 有一个错误(我读过一个,但它在 1.0.2 中得到修复,而我用于 Puma 的实际版本是 1.0.5)
  • 一些非常愚蠢的东西,我错过了,但我不知道去哪里看,因为 Controller 的操作包含 3 行代码,并且应用程序配置大多是默认的...
  • 这是与配置相关的东西,因为回溯根本不包含 Controller ...
  • 最佳答案

    你能粘贴完整的堆栈跟踪吗?
    我的假设是 set_header 是从迭代 env 的方法中调用的。

    关于ruby-on-rails - 运行时错误 : can't add a new key into hash during iteration in Rack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47768547/

    相关文章:

    ruby-on-rails - Ruby on Rails 中多态模型的作用域

    ruby-on-rails - 更新属性 before_save 回调不保存额外的属性

    ruby-on-rails - 从数据库中删除旧记录 (Postgres/Rails)

    ruby - 检查@variable.method 是否存在?

    ruby-on-rails - Capistrano SQLite3::SQLException:没有这样的表:用户

    javascript - 在 Sinatra 上使用 express.js 而不是 Ruby 的想法?

    ruby-on-rails - 可以在 View 中使用@current_user 但不能在 Controller 中使用

    ruby - Cookie 数据大小超过 4K - 但其 'only' 1100 字节已加密

    ruby - 有没有人让 Padrino 与 Sprockets 和 Compass 一起工作?

    ruby - 寻找 Rack 应用程序结构和 config.ru 规范?