Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails 3 Cache Dump error

I use Rails 3.0.5 with Ruby 1.9.2 for an app. In my development mode, I have configured caching ON.

  config.action_controller.perform_caching = true
  config.cache_store = :file_store, "#{Rails.root.to_s}/tmp/cache"

And in one of the actions, I have this line of code,

@featured_players = Rails.cache.fetch("featured-players") { Player.featured(8) }

The above line returns the following error

TypeError (no marshal_dump is defined for class Mutex):
  activesupport (3.0.5) lib/active_support/cache/file_store.rb:100:in `dump'
  activesupport (3.0.5) lib/active_support/cache/file_store.rb:100:in `block in write_entry'
  activesupport (3.0.5) lib/active_support/core_ext/file/atomic.rb:20:in `atomic_write'
  activesupport (3.0.5) lib/active_support/cache/file_store.rb:100:in `write_entry'
  activesupport (3.0.5) lib/active_support/cache/strategy/local_cache.rb:135:in `write_entry'
  activesupport (3.0.5) lib/active_support/cache.rb:364:in `block in write'
  activesupport (3.0.5) lib/active_support/cache.rb:519:in `instrument'

featured is a class method of Player model that returns an array of players as a result of a db query. Its just a plain old array.

What seems to be the error.. I have tried several approaches to analyze this, but none worked. please help

like image 261
Anand Avatar asked Apr 20 '26 22:04

Anand


1 Answers

The cache is using standard marshalling to cache your objects. One of the objects that you're trying to serialize has a Mutex in it but you can't serialize something that is little more than a bit of runtime state:

Some objects cannot be dumped: if the objects to be dumped include bindings, procedure or method objects, instances of class IO, or singleton objects, a TypeError will be raised.

The problem is that some things only exist as runtime information and they cannot be recreated automatically.

You have a thread mutex somewhere in your Player and Marshal has no way of automatically serializing a mutex. You're going to have to implement your own serialization; there are two methods of doing this outlined in the Marshal documentation:

  • Implement marshal_dump and marshal_load methods.
  • Implement _dump and _load methods.

You'll probably want to go with marshal_dump and marshal_load as they're the easiest.

like image 79
mu is too short Avatar answered Apr 23 '26 13:04

mu is too short