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.