New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Issue 338 #393
Issue 338 #393
Conversation
…c so that it covers the method in question instead of stubbing it out. This is important because this actually makes this test case fail. There is a defect in the implementation of delete_cache_id that was never being covered by the specs because the call to it was stubbed out.
…s to parent" spec to not make assumptions about the order of Hash keys. This test was breaking intermittently when unrelated tests changed, only by causing the Hash keys to be returned in a different order.
…#delete_cache_id This fixes the broken spec "CarrierWave::Uploader#store! should delete the old cache_id" that was added in 7f9c35f This now breaks numerous other specs and support for uploaders with multiple versions, because now that the cache dir is successfully being deleted after the first version is stored, other versions in that cache are being prematurely deleted.
…rage option set to false should not delete the old cache_id" spec more explicitly check for the presences of the directories we want to ensure are not deleted.
… if it is not empty.
Thanks for the fixes and sorry for leaving warts behind me. I'm new to testing, and my original issue was stubbing methods on globals like Dir, File. |
@clyfe - The real files were being created during tests before I ever touched them - in after do
FileUtils.rm_rf(public_path)
end I actually prefer it this way. The test code in question is spec'ing the behavior surrounding these files and directories, so in my opinion, it really should be exercising what you expect it to do in the real world as close as is practical. In my experience very strict unit testing where you stub and mock everything outside your test concern can become a bit cumbersome. You would have had to unit test the Anyway - thanks for carrying the ball most of the way on this. This was a good one to get nailed. |
Great work, guys. I'm hoping we get a couple more issues cleaned up in the next week or two. I think we should have a quick turnaround for another gem release -- so bug me if you haven't seen any movement after a few weeks. |
== Problem Errno::EMLINK: Too many links @ dir_s_mkdir == Full Backtrace /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:247 :in `mkdir` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:247 :in `fu_mkdir` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:224 :in `block (2 levels) in mkdir_p` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:222 :in `reverse_each` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:222 :in `block in mkdir_p` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:208 :in `each` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:208 :in `mkdir_p` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/sanitized_file.rb:290 :in `mkdir!` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/sanitized_file.rb:209 :in `copy_to` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/uploader/cache.rb:131 :in `block in cache!` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/uploader/callbacks.rb:17 :in `with_callbacks` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/uploader/cache.rb:122 :in `cache!` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/mount.rb:327 :in `cache` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/mount.rb:179 :in `file=` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/orm/activerecord.rb:38 :in `file=` == Why <TODO> == Reproduce Let's imagine a rails app with a User#avatar require 'tempfile' 32001.times { User.new avatar: Tempfile.new("foo") } # This will create 32001 dirs within /public/uploads/tmp == Related Pull Requests / Issues / Links * [How to: Delete cache garbage directories](https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Delete-cache-garbage-directories) * [Remove the cached file after storing it carrierwaveuploader#107](carrierwaveuploader#107) * [Remove the cached file after storing it carrierwaveuploader#125](carrierwaveuploader#125) * [delete cache garbage dirs carrierwaveuploader#338](carrierwaveuploader#338) * [delete cache garbage dirs issue carrierwaveuploader#338 carrierwaveuploader#346](carrierwaveuploader#346) * [Issue 338 carrierwaveuploader#393](carrierwaveuploader#393) * [tmp files not being deleted carrierwaveuploader#1489](carrierwaveuploader#1489)
== Problem Errno::EMLINK: Too many links @ dir_s_mkdir == Full Backtrace (carrierwave 0.9) /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:247 :in `mkdir` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:247 :in `fu_mkdir` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:224 :in `block (2 levels) in mkdir_p` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:222 :in `reverse_each` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:222 :in `block in mkdir_p` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:208 :in `each` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:208 :in `mkdir_p` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/sanitized_file.rb:290 :in `mkdir!` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/sanitized_file.rb:209 :in `copy_to` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/uploader/cache.rb:131 :in `block in cache!` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/uploader/callbacks.rb:17 :in `with_callbacks` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/uploader/cache.rb:122 :in `cache!` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/mount.rb:327 :in `cache` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/mount.rb:179 :in `file=` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/orm/activerecord.rb:38 :in `file=` == Why Some file systems only allow a limited number of subdirectories. Ext3 for example only allow ~32k subdirectories. == Reproduce Let's imagine a rails app with a User#avatar require 'tempfile' 32001.times { User.new avatar: Tempfile.new("foo") } # This will create 32001 dirs within /public/uploads/tmp == Fix Clean cache after caching failed. == Related Pull Requests / Issues / Links * [How to: Delete cache garbage directories](https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Delete-cache-garbage-directories) * [Remove the cached file after storing it carrierwaveuploader#107](carrierwaveuploader#107) * [Remove the cached file after storing it carrierwaveuploader#125](carrierwaveuploader#125) * [delete cache garbage dirs carrierwaveuploader#338](carrierwaveuploader#338) * [delete cache garbage dirs issue carrierwaveuploader#338 carrierwaveuploader#346](carrierwaveuploader#346) * [Issue 338 carrierwaveuploader#393](carrierwaveuploader#393) * [tmp files not being deleted carrierwaveuploader#1489](carrierwaveuploader#1489)
== Problem Errno::EMLINK: Too many links @ dir_s_mkdir == Full Backtrace (carrierwave 0.9) /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:247 :in `mkdir` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:247 :in `fu_mkdir` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:224 :in `block (2 levels) in mkdir_p` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:222 :in `reverse_each` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:222 :in `block in mkdir_p` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:208 :in `each` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:208 :in `mkdir_p` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/sanitized_file.rb:290 :in `mkdir!` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/sanitized_file.rb:209 :in `copy_to` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/uploader/cache.rb:131 :in `block in cache!` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/uploader/callbacks.rb:17 :in `with_callbacks` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/uploader/cache.rb:122 :in `cache!` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/mount.rb:327 :in `cache` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/mount.rb:179 :in `file=` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/orm/activerecord.rb:38 :in `file=` == Why Some file systems only allow a limited number of subdirectories. Ext3 for example only allow ~32k subdirectories. == Reproduce Let's imagine a rails app with a User#avatar require 'tempfile' 32001.times { User.new avatar: Tempfile.new("foo") } # This will create 32001 dirs within /public/uploads/tmp == Fix Clean cache after caching failed. == Related Pull Requests / Issues / Links * [How to: Delete cache garbage directories](https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Delete-cache-garbage-directories) * [Remove the cached file after storing it carrierwaveuploader#107](carrierwaveuploader#107) * [Remove the cached file after storing it carrierwaveuploader#125](carrierwaveuploader#125) * [delete cache garbage dirs carrierwaveuploader#338](carrierwaveuploader#338) * [delete cache garbage dirs issue carrierwaveuploader#338 carrierwaveuploader#346](carrierwaveuploader#346) * [Issue 338 carrierwaveuploader#393](carrierwaveuploader#393) * [tmp files not being deleted carrierwaveuploader#1489](carrierwaveuploader#1489)
== Problem Errno::EMLINK: Too many links @ dir_s_mkdir == Full Backtrace (carrierwave 0.9) /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:247 :in `mkdir` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:247 :in `fu_mkdir` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:224 :in `block (2 levels) in mkdir_p` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:222 :in `reverse_each` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:222 :in `block in mkdir_p` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:208 :in `each` /opt/rubies/ruby-2.1.5/lib/ruby/2.1.0/fileutils.rb:208 :in `mkdir_p` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/sanitized_file.rb:290 :in `mkdir!` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/sanitized_file.rb:209 :in `copy_to` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/uploader/cache.rb:131 :in `block in cache!` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/uploader/callbacks.rb:17 :in `with_callbacks` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/uploader/cache.rb:122 :in `cache!` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/mount.rb:327 :in `cache` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/mount.rb:179 :in `file=` [GEM_ROOT]/gems/carrierwave-0.9.0/lib/carrierwave/orm/activerecord.rb:38 :in `file=` == Why Some file systems only allow a limited number of subdirectories. Ext3 for example only allow ~32k subdirectories. == Reproduce Let's imagine a rails app with a User#avatar require 'tempfile' 32001.times { User.new avatar: Tempfile.new("foo") } # This will create 32001 dirs within /public/uploads/tmp == Fix Clean cache after caching failed. == Related Pull Requests / Issues / Links * [How to: Delete cache garbage directories](https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Delete-cache-garbage-directories) * [Remove the cached file after storing it carrierwaveuploader#107](carrierwaveuploader#107) * [Remove the cached file after storing it carrierwaveuploader#125](carrierwaveuploader#125) * [delete cache garbage dirs carrierwaveuploader#338](carrierwaveuploader#338) * [delete cache garbage dirs issue carrierwaveuploader#338 carrierwaveuploader#346](carrierwaveuploader#346) * [Issue 338 carrierwaveuploader#393](carrierwaveuploader#393) * [tmp files not being deleted carrierwaveuploader#1489](carrierwaveuploader#1489)
I believe this should re-close GH issue #338. To summarize:
delete_cache_id
method was stubbed and never actually tested.FileUtils.rm_rf
to delete the entire cache dir, deleting other versions before they were stored.Dir.rmdir
which fails if the directory is not empty.cache_dir
mechanism. I believe these concerns are addressed because:cache_dir
is never deleted. Only the subdirs underneath it, that are created by CarrierWave, are.If this gets pulled into master and released with the next gem version, I'd be happy to update the notes in this wiki to reflect the differences in the new version: https://github.com/jnicklas/carrierwave/wiki/How-to:-Delete-cache-garbage-directories