Skip to content

Commit

Permalink
Merge pull request #1721 from Deradon/feature/file-storage_cache-with…
Browse files Browse the repository at this point in the history
…-clean-on-exception

Store::File#cache! will clean_cache! and retry after Errno::EMLINK
  • Loading branch information
thomasfedb committed Nov 26, 2015
2 parents 2ea757e + d74ee6b commit 5217412
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 0 deletions.
8 changes: 8 additions & 0 deletions lib/carrierwave/storage/file.rb
Expand Up @@ -64,6 +64,14 @@ def retrieve!(identifier)
#
def cache!(new_file)
new_file.move_to(::File.expand_path(uploader.cache_path, uploader.root), uploader.permissions, uploader.directory_permissions, true)
rescue Errno::EMLINK => e
raise(e) if @cache_called
@cache_called = true

# NOTE: Remove cached files older than 10 minutes
clean_cache!(600)

cache!(new_file)
end

##
Expand Down
17 changes: 17 additions & 0 deletions spec/storage/file_spec.rb
@@ -1,8 +1,16 @@
# encoding: utf-8

require 'spec_helper'
require 'support/file_utils_helper'
require 'tempfile'

describe CarrierWave::Storage::File do
include FileUtilsHelper

subject(:storage) { described_class.new(@uploader) }

let(:tempfile) { Tempfile.new("foo") }
let(:sanitized_temp_file) { CarrierWave::SanitizedFile.new(tempfile) }

before do
@uploader_class = Class.new(CarrierWave::Uploader::Base)
Expand Down Expand Up @@ -39,6 +47,15 @@
end
end

describe '#cache!' do
context "when FileUtils.mkdir_p raises Errno::EMLINK" do
before { fake_failed_mkdir_p }
after { storage.cache!(sanitized_temp_file) }

it { is_expected.to receive(:clean_cache!).with(600) }
end
end

describe '#clean_cache!' do
before do
five_days_ago_int = 1369894322
Expand Down
15 changes: 15 additions & 0 deletions spec/support/file_utils_helper.rb
@@ -0,0 +1,15 @@
module FileUtilsHelper
# NOTE: Make FileUtils.mkdir_p to raise `Errno::EMLINK` only once
def fake_failed_mkdir_p
original_mkdir_p = FileUtils.method(:mkdir_p)
mkdir_p_called = false
allow(FileUtils).to receive(:mkdir_p) do |args|
if mkdir_p_called
original_mkdir_p.call(*args)
else
mkdir_p_called = true
raise Errno::EMLINK
end
end
end
end

0 comments on commit 5217412

Please sign in to comment.