Journey

技術に関することと覚書と

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のときも同じ問題が起こっていたみたいなのでそこからコード引っ張ってきました

参考

github.com