From 135d3e15b72b9820212027b057df8980140a947b Mon Sep 17 00:00:00 2001 From: schneems Date: Thu, 20 Sep 2018 13:56:07 -0500 Subject: [close #33907] Error when using "recyclable" cache keys with a store that does not support it If you are using the "in cache versioning" also known as "recyclable cache keys" the cache store must be aware of this scheme, otherwise you will generate cache entries that never invalidate. This PR adds a check to the initialization process to ensure that if recyclable cache keys are being used via ``` config.active_record.cache_versioning = true ``` Then the cache store needs to show that it supports this versioning scheme. Cache stores can let Rails know that they support this scheme by adding a method `supports_in_cache_versioning?` and returning true. --- activerecord/lib/active_record/railtie.rb | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'activerecord/lib/active_record') diff --git a/activerecord/lib/active_record/railtie.rb b/activerecord/lib/active_record/railtie.rb index b213754641..fcee3de0b7 100644 --- a/activerecord/lib/active_record/railtie.rb +++ b/activerecord/lib/active_record/railtie.rb @@ -88,6 +88,29 @@ module ActiveRecord end end + initializer "Check for cache versioning support" do + config.after_initialize do |app| + ActiveSupport.on_load(:active_record) do + if app.config.active_record.cache_versioning && Rails.cache + unless Rails.cache.try(:supports_in_cache_versioning?) + raise <<-end_error + +You're using a cache store `#{Rails.cache.class}` that does not support +"recyclable" cache keys, also known as "in cache versioning". To +fix this issue either disable "recyclable" cache keys by setting: + + config.active_record.cache_versioning = false + +Or switching to a cache store that supports this functionality: +https://guides.rubyonrails.org/caching_with_rails.html#cache-stores + +end_error + end + end + end + end + end + initializer "active_record.check_schema_cache_dump" do if config.active_record.delete(:use_schema_cache_dump) config.after_initialize do |app| -- cgit v1.2.3 From 3424bd83d699bb996aa27d85b970e484d37e3485 Mon Sep 17 00:00:00 2001 From: schneems Date: Thu, 20 Sep 2018 20:40:31 -0500 Subject: Switch to supports_cache_versioning? check to a class method - Moving the `supports_cache_versioning?` check to a class method. - Shorten the method doc. - Expand on the error message. --- activerecord/lib/active_record/railtie.rb | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'activerecord/lib/active_record') diff --git a/activerecord/lib/active_record/railtie.rb b/activerecord/lib/active_record/railtie.rb index fcee3de0b7..812fecbf32 100644 --- a/activerecord/lib/active_record/railtie.rb +++ b/activerecord/lib/active_record/railtie.rb @@ -92,17 +92,19 @@ module ActiveRecord config.after_initialize do |app| ActiveSupport.on_load(:active_record) do if app.config.active_record.cache_versioning && Rails.cache - unless Rails.cache.try(:supports_in_cache_versioning?) + unless Rails.cache.class.try(:supports_cache_versioning?) raise <<-end_error -You're using a cache store `#{Rails.cache.class}` that does not support -"recyclable" cache keys, also known as "in cache versioning". To -fix this issue either disable "recyclable" cache keys by setting: +You're using a cache store that doesn't support native cache versioning. +Your best option is to upgrade to a newer version of #{Rails.cache.class} +that supports cache versioning (#{Rails.cache.class}.supports_cache_versioning? #=> true). - config.active_record.cache_versioning = false +Next best, switch to a different cache store that does support cache versioning: +https://guides.rubyonrails.org/caching_with_rails.html#cache-stores. + +To keep using the current cache store, you can turn off cache versioning entirely: -Or switching to a cache store that supports this functionality: -https://guides.rubyonrails.org/caching_with_rails.html#cache-stores + config.active_record.cache_versioning = false end_error end -- cgit v1.2.3