Rails6でセグメンテーションエラーが発生する問題を解決した
概要
WebアプリケーションをRuby on Rails(Rails)を使って作成しているのですが、ある時実行中にセグメンテーションエラーが発生するようになりました。
ここでは、私が遭遇したセグメンテーションエラーの解決方法について紹介します。
環境
- Rails 6.0.2
内容
私がセグメンテーションエラーを発見したのは、CIでのテストの実行をしたときでした。 手元の開発環境では発生してはいなかったので、なぜ発生したのか、どのようなときに発生するのかが分からずかなり苦労しました。
セグメンテーションエラーの発生時には次のようなログが出力されていました。
…/usr/local/bundle/gems/sassc-2.2.1/lib/sassc/engine.rb:42: [BUG] Segmentation fault at 0x0000000000000000
見たところ、sasscでエラーが発生しているようです。
解決方法
エラーメッセージで色々と調べてみると、そもそもRails 6.0において、標準で使われるようになったSprocketsのあたりが怪しいということのようです。 また、Rails 6.0ではSprocketsの関係で、assetsのコンパイルが並列で行われるということのようで、これが悪さをしている可能性があるということのです。
ソースはここです。
url helpers aren’t thread safe · Issue #581 · rails/sprockets
そこで、並列で実行しないようにしました。
その設定は、config/initializers/assets.rb
に記述します。
次の内容を記述します。
Rails.application.config.assets.configure do |env|
env.export_concurrent = false
end
私の場合はこれでセグメンテーションエラーが解決しました。
さいごに
今回の対応は、あまりいい対応ではありません。
gemの方では、この記事の執筆時点で対応中ということのようなので、気長に対応されるまで待ちたいと思います。