bug with mem_cache and marshaling

i'm seeing issues with how caching interacts with auto const loading in production. it's find if the objects cached are top-level themselves, but an object graph (model + associations) is cached i'll get errors when a production process first comes up (no models loaded) and hits the cache to get said object graph.

this fix, which is a uber hack, shows quite clearly the bug - i'm *really* curious if anyone else has seen this behaviour

the hack:

vendor/rails/activesupport/lib/active_support/cache/mem_cache_store.rb

  24 def read(key, options = nil)
  25 super
  26 @data.get(key, raw?(options))
  27 rescue MemCache::MemCacheError => e
  28 logger.error("MemCacheError (#{e}): #{e.message}")
  29 nil
  30 rescue ArgumentError => e
  31 message = e.message
  32 raise unless message =~ %r|undefined class/module|
  33 class_name = message.scan(%r/\w+/).last
  34 begin
  35 ActiveSupport::Dependencies.load_missing_constant ActiveRecord::Base, class_name
  36 rescue Object
  37 raise e
  38 end
  39 end

in case it isn't obvious this simply shows that rails const loading mechanism is not triggered from a Marshal.load, which makese sense actually....

thoughts?

a @ http://codeforpeople.com/

this fix, which is a uber hack, shows quite clearly the bug - i'm
*really* curious if anyone else has seen this behaviour

This has been reported a few times before, but given that it only
happens during the initial requests, it's less likely to be noticed.

in case it isn't obvious this simply shows that rails const loading
mechanism is not triggered from a Marshal.load, which makese sense
actually....

Yeah, marshal doesn't trigger any of the const_missing hooks that we
rely on for dependency loading. There's not a lot we can do here.

thoughts?

If you're using 2.2 or later the preloading of classes and templates
will catch 99.999% of this now as all files in lib/ app/models and
app/controllers are required before the first request is processed.

cache_fu has a method for handling this type of issue which has been
adapted for Rails.cache here:

http://github.com/actsasflinn/snippy/blob/77bdc5760180a5b5a8652af6dc6b1e3ecebbd99f/vendor/plugins/cache_contrib/lib/active_support/cache/patches/auto_load_missing_constants.rb

It's not really a bug per se, just a limitation in that un-marshaling
doesn't autoload. It'd be nice to see Rails.cache support this type
of behavior though.