How do I clear my Rails file cache?
Asked Answered
W

3

48

I’m running Rails 4.2.7 on Ubuntu 14.04. I have written the following method to help cache some data (preventing hits against my PostGres 9.5 database) …

class Country < ActiveRecord::Base
  has_many :states

  def self.cached_find_by_iso(iso)
    Rails.cache.fetch("#{iso}") do
      find_by_iso(iso)
    end
  end

end

However, even after running rake tmp:cache:clear and restarting my server, I’m getting this error when attempting to invoke the above …

Error during processing: Not a directory @ rb_file_s_rename - (/home/rails/myproject/tmp/cache/00020161104-1093-67j634, /home/rails/myproject/tmp/cache/001/000/)
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fileutils.rb:528:in `rename'
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fileutils.rb:528:in `block in mv'
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fileutils.rb:1571:in `block in fu_each_src_dest'
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fileutils.rb:1587:in `fu_each_src_dest0'
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fileutils.rb:1569:in `fu_each_src_dest'
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fileutils.rb:517:in `mv'
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/core_ext/file/atomic.rb:36:in `atomic_write'
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/cache/file_store.rb:83:in `write_entry'
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/cache/strategy/local_cache.rb:115:in `write_entry'
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/cache.rb:391:in `block in write'
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/cache.rb:547:in `block in instrument'
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/notifications.rb:166:in `instrument'
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/cache.rb:547:in `instrument'
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/cache.rb:389:in `write'
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/cache.rb:588:in `save_block_result_to_cache'
/usr/local/rvm/gems/ruby-2.3.0/gems/activesupport-4.2.7.1/lib/active_support/cache.rb:299:in `fetch'
/home/rails/myproject/app/models/country.rb:5:in `cached_find_by_iso'
/home/rails/myproject/app/services/all_events_guide_service.rb:84:in `block in process_page_data'
/usr/local/rvm/gems/ruby-2.3.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:187:in `block in each'
/usr/local/rvm/gems/ruby-2.3.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:186:in `upto'
/usr/local/rvm/gems/ruby-2.3.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:186:in `each'
/home/rails/myproject/app/services/all_events_guide_service.rb:45:in `process_page_data'
/home/rails/myproject/app/services/abstract_import_service.rb:83:in `process_my_object_data'
/home/rails/myproject/app/services/all_events_guide_my_object_finder_service.rb:103:in `block in process_my_object_link'
/usr/local/rvm/gems/ruby-2.3.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:187:in `block in each'
/usr/local/rvm/gems/ruby-2.3.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:186:in `upto'
/usr/local/rvm/gems/ruby-2.3.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:186:in `each'
/home/rails/myproject/app/services/all_events_guide_my_object_finder_service.rb:82:in `process_my_object_link'
/home/rails/myproject/app/services/abstract_my_object_finder_service.rb:29:in `block in process_data'
/home/rails/myproject/app/services/abstract_my_object_finder_service.rb:28:in `each'
/home/rails/myproject/app/services/abstract_my_object_finder_service.rb:28:in `process_data'
/home/rails/myproject/app/services/run_crawlers_service.rb:18:in `block in run_all_crawlers'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/relation/delegation.rb:46:in `each'
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/relation/delegation.rb:46:in `each'
/home/rails/myproject/app/services/run_crawlers_service.rb:5:in `run_all_crawlers'
/home/rails/myproject/app/controllers/my_objects_controller.rb:170:in `block in import'

What’s the right way to clear my cache and allow my cached method to start work properly?

Edit: I get the same above error with Deepak's suggestion, but here is the output to his answer ...

rails@mymachine:~/myproject$ rails console
Loading development environment (Rails 4.2.7.1)
2.3.0 :001 > Rails.cache.clear
 => ["/home/rails/myproject/tmp/cache/assets"] 
2.3.0 :002 > quit

Edit 2: Here’s my config/environments.production.rb file. This is a production environment …

Rails.application.configure do
  # Settings specified here will take precedence over those in config/application.rb.

  # Code is not reloaded between requests.
  config.cache_classes = true

  # Eager load code on boot. This eager loads most of Rails and
  # your application in memory, allowing both threaded web servers
  # and those relying on copy on write to perform better.
  # Rake tasks automatically ignore this option for performance.
  config.eager_load = true

  # Full error reports are disabled and caching is turned on.
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true

  # Enable Rack::Cache to put a simple HTTP cache in front of your application
  # Add `rack-cache` to your Gemfile before enabling this.
  # For large-scale production use, consider using a caching reverse proxy like
  # NGINX, varnish or squid.
  # config.action_dispatch.rack_cache = true

  # Disable serving static files from the `/public` folder by default since
  # Apache or NGINX already handles this.
  config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?

  # Compress JavaScripts and CSS.
  config.assets.js_compressor = :uglifier
  # config.assets.css_compressor = :sass

  # Do not fallback to assets pipeline if a precompiled asset is missed.
  config.assets.compile = false

  # Asset digests allow you to set far-future HTTP expiration dates on all assets,
  # yet still be able to expire them through the digest params.
  config.assets.digest = true

  # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb

  # Specifies the header that your server uses for sending files.
  # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
  # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX

  # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
  # config.force_ssl = true

  # Use the lowest log level to ensure availability of diagnostic information
  # when problems arise.
  config.log_level = :debug

  # Prepend all log lines with the following tags.
  # config.log_tags = [ :subdomain, :uuid ]

  # Use a different logger for distributed setups.
  # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)

  # Use a different cache store in production.
  # config.cache_store = :mem_cache_store

  # Enable serving of images, stylesheets, and JavaScripts from an asset server.
  # config.action_controller.asset_host = 'http://assets.example.com'

  # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
  # the I18n.default_locale when a translation cannot be found).
  config.i18n.fallbacks = true

  # Send deprecation notices to registered listeners.
  config.active_support.deprecation = :notify

  # Use default logging formatter so that PID and timestamp are not suppressed.
  config.log_formatter = ::Logger::Formatter.new

  # Do not dump schema after migrations.
  config.active_record.dump_schema_after_migration = false

  config.serve_static_assets = true
  config.assets.compile = true
end
Wherever answered 5/11, 2016 at 1:51 Comment(5)
everything depends on where You store Your cache. check config files and find: config.cache_store and then do cleanup according Your settingsShinn
I have no such setting anywhere in my appication. In my config/environments/proudtion.rb file, the line is commented out, "# config.cache_store = :mem_cache_store"Wherever
Deepak has answered to Your questionShinn
Can you try to set iso variable as integer value ?Rance
What iso variable are you talking about?Wherever
R
136

Instead of rake tmp:cache:clear run the following command in console

Rails.cache.clear

This will clear the cache from whatever cache store you are using

config.cache_store = :file_store
# or
config.cache_store = :mem_cache_store
Ringsmuth answered 7/11, 2016 at 7:55 Comment(5)
Per my comment to numBar, I have no "config.cache_store" file setting. However, I edited my qeustion to show your suggestion. I still get the "Not a directory @ rb_file_s_rename" after running the commands detailed in the edit.Wherever
can you please post the settings as well from your development.rb or production.rbRingsmuth
Sure, edited my question to include the config/enviornmetns/produciton.rb file (this is a production environment)Wherever
!!!!WARNING: Rails.cache.clear does NOT JUST CLEAR RAILS cache keys. If your cache is redis and you are also running sidekiq, say goodbye to all your scheduled jobs, job history, etc.Revelation
For the above comment about cache clearing affect background jobs I would recommend having a separate instance for your background jobs. Commingling cache with jobs can lead to a lot of headaches. One example is expiration strategy and how they should differ from cache vs jobs.Equanimous
F
5

While Rails.cache.clear should only be used in development as it will clear everything, including jobs etc, it's best to clear something with a key. When you store cache, you used a key, right? Then use that key to delete:

key = "my_unique_key"
Rails.cache.delete(key)
Fluent answered 17/1, 2023 at 8:33 Comment(0)
L
3

It looks like your application is somehow requiring the path tmp/cache/001/000/ to exist. And, as you can see in: https://github.com/rails/rails/blob/4-2-stable/railties/lib/rails/tasks/tmp.rake#L25-L30, the task rake tmp:cache:clear removed all contents from tmp/cache including 001/000. I guess a quick solution would be to manually create that path by mkdir -p tmp/cache/001/000/ inside your project root after clearing your cache.

You could add a custom task to your application to automate this by rails g task cache and writing something like:

namespace :cache do
  task :clear do
    FileUtils.rm_rf(Dir['tmp/cache/[^.]*'])
    `mkdir -p tmp/cache/001/000/`
  end
end

You could then invoke your custom rake cache:clear and be sure that the demanded path exists.

Laughlin answered 11/11, 2016 at 11:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.