Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I clear my Rails file cache?

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
like image 829
Dave Avatar asked Nov 05 '16 01:11

Dave


People also ask

Where is Rails cache stored?

By default, the page cache directory is set to Rails. public_path (which is usually set to the public folder) and this can be configured by changing the configuration setting config. action_controller. page_cache_directory.

What does Rails cache do?

1.1 Page Caching Page caching is a Rails mechanism which allows the request for a generated page to be fulfilled by the web server (i.e. Apache or NGINX) without having to go through the entire Rails stack. While this is super fast it can't be applied to every situation (such as pages that need authentication).

What is view caching in Rails?

What is View Caching. View caching in Ruby on Rails is taking the HTML that a view generates and storing it for later. Although Rails has support for writing these to the filesystem or keeping them in memory, for production use, you'll almost certainly want a standalone caching server, such as Memcached or Redis.

How do I clear a cache plugin?

To clear your WordPress site's cache with The WP Super Cache plugin, on your WordPress dashboard, navigate to Settings, then Wp Super Cache, then click Delete Cache. W3 Total Cache is designed to enhance the user experience of your website by speeding up the loading speed of your content through CDN integration.


2 Answers

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 
like image 190
Deepak Mahakale Avatar answered Oct 04 '22 03:10

Deepak Mahakale


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.

like image 39
Tom König Avatar answered Oct 04 '22 03:10

Tom König