# <Net::OpenTimeout: 実行期限切れ>

@rakekniven のフォーラムのパフォーマンス問題を解決するのを手伝っていますが、ユーザーは画像をアップロードできなくなっています。このエラーが頻繁に発生しています。この人も同様のエラーが発生しており、画像をアップロードできないようです

フォーラムのプラグイン
  • Canned Replies
  • discourse-checklist
  • discourse-legal-tools
  • discourse-solved
  • docker_manager
  • styleguide - 無効
Message (661 copies reported) on  2.9.0.beta4 

#<Net::OpenTimeout: execution expired>

Backtrace

/usr/local/lib/ruby/2.7.0/net/http.rb:960:in initialize' /usr/local/lib/ruby/2.7.0/net/http.rb:960:in open’
/usr/local/lib/ruby/2.7.0/net/http.rb:960:in block in connect' /usr/local/lib/ruby/2.7.0/timeout.rb:105:in timeout’
/usr/local/lib/ruby/2.7.0/net/http.rb:958:in connect' /usr/local/lib/ruby/2.7.0/net/http.rb:943:in do_start’
/usr/local/lib/ruby/2.7.0/net/http.rb:932:in start' /usr/local/lib/ruby/2.7.0/net/http.rb:606:in start’
/var/www/discourse/lib/final_destination.rb:515:in safe_session' /var/www/discourse/lib/final_destination.rb:455:in safe_get’

アップロードエラー

Net::OpenTimeout : execution expired

メッセージ (273757 件報告あり)

乗っ取られたレスポンスを正しく処理できませんでした : Net::OpenTimeout : execution expired

バックトレース

/usr/local/lib/ruby/2.7.0/net/http.rb:960:in initialize' /usr/local/lib/ruby/2.7.0/net/http.rb:960:in open’
/usr/local/lib/ruby/2.7.0/net/http.rb:960:in block in connect' /usr/local/lib/ruby/2.7.0/timeout.rb:105:in timeout’
/usr/local/lib/ruby/2.7.0/net/http.rb:958:in connect' /usr/local/lib/ruby/2.7.0/net/http.rb:943:in do_start’
/usr/local/lib/ruby/2.7.0/net/http.rb:932:in start' /usr/local/lib/ruby/2.7.0/net/http.rb:606:in start’
/var/www/discourse/lib/final_destination.rb:515:in safe_session' /var/www/discourse/lib/final_destination.rb:455:in safe_get’
/var/www/discourse/lib/final_destination.rb:147:in get' /var/www/discourse/lib/file_helper.rb:68:in download’
/var/www/discourse/app/controllers/user_avatars_controller.rb:158:in proxy_avatar' /var/www/discourse/app/controllers/user_avatars_controller.rb:51:in block in show_proxy_letter’
/var/www/discourse/lib/hijack.rb:56:in instance_eval' /var/www/discourse/lib/hijack.rb:56:in block in hijack’
/var/www/discourse/lib/scheduler/defer.rb:94:in block in do_work' rails_multisite-4.0.1/lib/rails_multisite/connection_management.rb:80:in with_connection’
/var/www/discourse/lib/scheduler/defer.rb:89:in do_work' /var/www/discourse/lib/scheduler/defer.rb:79:in block (2 levels) in start_thread’

環境

Ruby で問題を解決するために Stack Overflow でこれを見つけました。

libc の特定のバージョンで DNS ルートを解決する問題のようです。数時間かけて解決策を探した結果、コードの先頭に require 'resolv-replace' を追加するだけでよいことがわかりました。

詳細はこちら: Use Ruby DNS resolver to handle DNS timeout in Net::HTTP by pranas · Pull Request #597 · ruby/ruby · GitHub

将来、誰かの役に立つことを願っています。