稀に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