Less is more.

学んだことなどについて書きます。

Rails5.2.0アップグレード時のマルチプロセスのコネクション管理

Rails5.1.6からRails5.2.0にアップグレードした際に対応が必要な箇所があったので対応内容をまとめます。

事象

アップグレード後にバッチを実行すると毎回同じ箇所でThreadErrorが発生するようになりました。
アップグレード前はバッチ実行時にスレッド数が一定だったのが、アップグレード後はバッチ実行に伴いスレッド数が増加しリソースの上限に達していました。

原因

 
リリースノート見てもスレッド関連の修正ないし何だろうとしばらく悩んでいましたが、調査したところマルチプロセス時のコネクションの管理をRails側で実行するようになったことが原因でした。

 
github.com

これまでマルチプロセス時のプロセス毎のコネクションはアプリケーション内で用意するコードを書いていましたが、Rails側で面倒を見てくれるようになったため処理が不要になったようです。

対応

修正前は下記のようにプロセス毎のコネクションを用意するコードを書いていました。

config = ActiveRecord::Base.remove_connection
Parallel.each(4.times, in_processes: 4) do |i|
  ActiveRecord::Base.establish_connection(config)
  begin
    # 並列処理を実行
  ensure
    ActiveRecord::Base.remove_connection
  end
end

Rails5.2.0ではコネクションの管理が不要なため該当のコードを削除することで、バッチ処理を実行してもスレッド数も増えずエラーが出なくなりました。

Parallel.each(4.times, in_processes: 4) do |i|
  # 並列処理を実行
end

 

これで問題なくRails5.2.0にアップグレードできました!