artsy / garner

A set of Rack middleware and cache helpers that implement various caching strategies.
MIT License
343 stars 24 forks source link

File cache store is limited by filename length constraint. #43

Open gib opened 11 years ago

gib commented 11 years ago

The following error came up in development with long URL cache keys:

File name too long - /Users/gib/Code/artsy/gravity/gib/tmp/cache/proxied_binding%3DGarner%3A%3AMixins%3A%3AMongoid%3A%3AIdentity%2Fklass%3DArtwork%2Chandle%3Dkammy-roulner-when-confronted-with-a-piece-of-art-dot-dot-dot%2Fstrategy%3DGarner%3A%3AStrategies%3A%3ABinding%3A%3AKey%3A%3ABindingIndex20130704-19291-s7dqiv.lock

Thanks for the speedy response and suggestions @fancyremarker!

fancyremarker commented 11 years ago

This seems more of an issue with the underlying cache store, per rails/rails#10894, but I'm taking a look into a reasonable fix within Garner.

fancyremarker commented 11 years ago

So, rails/rails#4907 is actually the more relevant issue, and rails/rails#4911 fixes this. In lieu of upgrading to Rails 4.0, I recommend something like the following in an initializer:

silence_warnings do
  ActiveSupport::Cache::FileStore::FILENAME_MAX_SIZE = 228
end
gib commented 11 years ago

Cool! Thanks!!

dblock commented 11 years ago

Setting the max size didn't work. One workaround is to use a MemoryStore. Another is a possible monkey patch:

module Garner
  module Cache

    private

    class << self

      alias_method :_compound_key, :compound_key

      def compound_key(bindings, key_hash)
        key = _compound_key(bindings, key_hash)
        Digest::SHA1.hexdigest(key.to_s) if key
      end

    end

  end
end
joeyAghion commented 11 years ago

File paths of unlimited length seem problematic even if we're able to work around this particular obstacle. Are there any drawbacks to using the digest instead?