LoginSignup
4
1

More than 5 years have passed since last update.

RailsのRails.cache.fetchでファイルキャッシュを使っていると稀にAn Errno::ENOENT occurred が発生する問題

Last updated at Posted at 2017-08-22

稀にRailsで以下のようなエラーが発生し、エラー通知のメールが来ていました。

No such file or directory @ rb_sysopen - /home/zenpou/app/releases/20170821015812/tmp/cache/AC8/071/.permissions_check.444012.8514.834672
  app/controllers/users_controller.rb:88:in `show'

RailsのRails.cache.fetchで使っている所です。
調べてみましたが相談はされつつも解決してない様子
https://github.com/rails/rails/issues/26396

エラーが起きてる該当箇所をみると、tmp/cacheに書き込みに行く際、ディレクトリに書き込んだ時のstatを取得する時、ディレクトリが無いと発生するようです。
キャッシュ削除してるタイミングと合う時なんかに発生してるのかな?

運用している状態で1カ月に1回程度の頻度なので、再現性がないのが辛い所です。

取り敢えず以下の様なパッチを当ててみました。

config/initializers/atomic.rb
require 'active_support/core_ext/file/atomic'
class File
  # Private utility method.
  def self.probe_stat_in(dir) #:nodoc:
    basename = [ 
      '.permissions_check',
      Thread.current.object_id,
      Process.pid,
      rand(1000000)
    ].join('.')

    file_name = join(dir, basename)
    begin
      FileUtils.touch(file_name)
    rescue Errno::ENOENT
      FileUtils.mkdir_p(dir)
      FileUtils.touch(file_name)
    end 
    stat(file_name)
  ensure
    FileUtils.rm_f(file_name) if file_name
  end 
end
4
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1