Active Storageをtask内で使おうとしたらハングした
タイトルのとおりですが
class User has_many_attached :files end
みたいなモデルがあったときにあるタスク内で
user = User.first %w[foo bar].each do |word| Tempfile.open(word) do |file| file.write(word) file.rewind user.files.attach( io: file, filename: word ) end end
のような複数ファイルをループ内で保存していくみたいな事しようとすると見事にログがピタッと止まりました。
はっきりとした原因はまだわかってないですが、どうやら ActiveStorage::AnalyzeJob
がジョブのキューに積まれて、そのまま処理を続けようとするとハングしてしまうようです。
なのでそもそもここは非同期処理である必要がないので
ActiveSupport.on_load(:active_job) do self.queue_adapter = :inline end
をループの前に書くことでちょっと無理やりですが同期処理に切り替えたところうまくいきました。
こういう問題の原因をぱっと予測できるエンジニアになりたい。
ちなみに参考リンクはseedのときも同じ問題が起こっていたみたいなのでそこからコード引っ張ってきました