Rails.cache throws "marshal dump" error when changed from memory store to memcached store

Posted by gsmendoza on Stack Overflow See other posts from Stack Overflow or by gsmendoza
Published on 2010-04-07T09:38:32Z Indexed on 2010/04/08 7:53 UTC
Read the original article Hit count: 583

Filed under:

If I set this in my environment

config.action_controller.cache_store = :mem_cache_store

ActionController::Base.cache_store will use a memcached store but Rails.cache will use a memory store instead:

$ ./script/console
>> ActionController::Base.cache_store
=> #<ActiveSupport::Cache::MemCacheStore:0xb6eb4bbc @data=<MemCache: 1 servers, ns: nil, ro: false>>
>> Rails.cache
=> #<ActiveSupport::Cache::MemoryStore:0xb78b5e54 @data={}>

In my app, I use Rails.cache.fetch(key){ object } to cache objects inside my helpers. All this time, I assumed that Rails.cache uses the memcached store so I'm surprised that it uses memory store.

If I change the cache_store setting in my environment to

config.cache_store = :mem_cache_store

both ActionController::Base.cache_store and Rails.cache will now use the same memory store, which is what I expect:

$ ./script/console
>> ActionController::Base.cache_store
=> #<ActiveSupport::Cache::MemCacheStore:0xb7b8e928 @data=<MemCache: 1 servers, ns: nil, ro: false>, @middleware=#<Class:0xb7b73d44>, @thread_local_key=:active_support_cache_mem_cache_store_local_cache>
>> Rails.cache
=> #<ActiveSupport::Cache::MemCacheStore:0xb7b8e928 @data=<MemCache: 1 servers, ns: nil, ro: false>, @middleware=#<Class:0xb7b73d44>, @thread_local_key=:active_support_cache_mem_cache_store_local_cache>

However, when I run the app, I get a "marshal dump" error in the line where I call Rails.cache.fetch(key){ object }

no marshal_dump is defined for class Proc

Extracted source (around line #1): 
1: Rails.cache.fetch(fragment_cache_key(...), :expires_in => 15.minutes) { ... }

vendor/gems/memcache-client-1.8.1/lib/memcache.rb:359:in 'dump'
vendor/gems/memcache-client-1.8.1/lib/memcache.rb:359:in 'set_without_newrelic_trace'

What gives? Is Rails.cache meant to be a memory store? Should I call controller.cache_store.fetch in the places where I call Rails.cache.fetch?

© Stack Overflow or respective owner

Related posts about ruby-on-rails