Unicorn + Rails 7.1:TypeError:错误的参数类型 strio(预期的 strio)(TypeError)

问题描述 投票:0回答:1

用户 我正在生产中使用 Unicorn Web 服务器运行一个大型 Rails 应用程序。从 Rails 7.0 升级到 7.1 后,我遇到以下问题:

这是通过 Unicorn 运行时每个请求发生的错误:

  127.0.0.1 - - [29/Nov/2023:09:53:30 +0100] "GET / HTTP/1.1" 500 51908 0.0197
TypeError: wrong argument type strio (expected strio) (TypeError)
    /Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/lint.rb:390:in `external_encoding'
    /Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/lint.rb:390:in `check_input'
    /Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/lint.rb:332:in `check_environment'
    /Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/lint.rb:57:in `response'
    /Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/lint.rb:35:in `call'
    /Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/show_exceptions.rb:27:in `call'
    /Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/common_logger.rb:43:in `call'
    /Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/chunked.rb:102:in `call'
    /Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/rack-3.0.8/lib/rack/content_length.rb:20:in `call'
    /Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/unicorn-6.1.0/lib/unicorn/http_server.rb:634:in `process_client'
    /Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/unicorn-6.1.0/lib/unicorn/http_server.rb:739:in `worker_loop'
    /Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/unicorn-6.1.0/lib/unicorn/http_server.rb:547:in `spawn_missing_workers'
    /Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/unicorn-6.1.0/lib/unicorn/http_server.rb:143:in `start'
    /Users/me/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/unicorn-6.1.0/bin/unicorn:128:in `<top (required)>'
    /Users/me/installs/ruby/3.2.2/bin/unicorn:25:in `load'
    /Users/me/installs/ruby/3.2.2/bin/unicorn:25:in `<main>'

所有请求都会发生这种情况。我当然尝试过从 https://yhbt.net/unicorn.git 将 Unicorn 更新到最新的 master 并机架到最新版本。 据我所知,Google 上“错误的参数类型 strio”的匹配搜索结果为零。 我在独角兽邮件列表中也找不到任何相关细节:https://yhbt.net/unicorn-public/ 我也无法在 https://github.com/rack/rack/issues

上找到任何相关内容

在这里调用external_encoding方法似乎失败https://github.com/rack/rack/blob/f6c583adb0e863e524bacedaf594602964e01078/lib/rack/lint.rb#L393C59-L393C76 该方法是在 C 中实现的......所以不知道为什么由于错误的参数类型而失败

可能是什么原因导致的以及如何进一步调试它?

ruby-on-rails rack unicorn
1个回答
0
投票

我也有类似的问题(尽管是使用 puma 服务器)。看起来像:

[timestamp] Listen loop: #<TypeError: wrong argument type strio (expected strio)>

(旁注:花点时间欣赏一下该消息的纯粹愚蠢)

该问题是在例行捆绑更新后出现的,该更新仅更新了一堆次要版本的内容,仅影响“裸机”Mac 开发 - docker 和 Linux 都很好。

原因是

debug
gem(当然,我们的开发/测试组中有它)具有
irb
的依赖性。
irb
在 1.7.x 和 1.10.x 之间的某个时刻添加了对
rdoc
的依赖。
rdoc
取决于
psych
psych
取决于
strio
。我们暂时解决了这个问题,方法是在
irb
上添加直接依赖项(在开发/测试组中)并将其固定到
~> 1.7
以防止其超出范围。这从我们的依赖树中删除了
rdoc
psych
strio

注意:我们没有费心去检查这是否是 irb 1.8、1.9 或 1.10 的更改,因此我们很可能可以安全地使用 1.8 或 1.9,我只是不太在意。

所以这个:

group :development, :test do
  gem 'debug', '~> 1.8'
end

变成:

group :development, :test do
  gem 'debug', '~> 1.8'
  gem 'irb', '~> 1.7'
end

希望这也是您的问题,因为这是互联网上我发现有人讨论此类错误的唯一地方。

© www.soinside.com 2019 - 2024. All rights reserved.