From 08aa8afd24e65525757c6cb9ef2af60b5984c6ac Mon Sep 17 00:00:00 2001 From: fatkodima Date: Mon, 5 Feb 2018 00:35:17 +0200 Subject: RedisCacheStore: fix `#write_multi` mset serialization Closes #31886 Fixes #31884 --- activesupport/lib/active_support/cache/redis_cache_store.rb | 9 ++++++++- activesupport/test/cache/behaviors/cache_store_behavior.rb | 10 ++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) (limited to 'activesupport') diff --git a/activesupport/lib/active_support/cache/redis_cache_store.rb b/activesupport/lib/active_support/cache/redis_cache_store.rb index 1de98dcd6c..b5a2a2a636 100644 --- a/activesupport/lib/active_support/cache/redis_cache_store.rb +++ b/activesupport/lib/active_support/cache/redis_cache_store.rb @@ -17,6 +17,7 @@ end require "digest/sha2" require "active_support/core_ext/marshal" +require "active_support/core_ext/hash/transform_values" module ActiveSupport module Cache @@ -360,7 +361,13 @@ module ActiveSupport if entries.any? if mset_capable? && expires_in.nil? failsafe :write_multi_entries do - redis.mapped_mset(entries) + serialized_entries = if options[:raw] + entries.transform_values { |e| e.value.to_s } + else + entries.transform_values { |e| serialize_entry(e) } + end + + redis.mapped_mset(serialized_entries) end else super diff --git a/activesupport/test/cache/behaviors/cache_store_behavior.rb b/activesupport/test/cache/behaviors/cache_store_behavior.rb index ac37ab6e61..efb57d34a2 100644 --- a/activesupport/test/cache/behaviors/cache_store_behavior.rb +++ b/activesupport/test/cache/behaviors/cache_store_behavior.rb @@ -113,6 +113,16 @@ module CacheStoreBehavior assert_equal("fufu", @cache.read("fu")) end + def test_fetch_multi_without_expires_in + @cache.write("foo", "bar") + @cache.write("fud", "biz") + + values = @cache.fetch_multi("foo", "fu", "fud", expires_in: nil) { |value| value * 2 } + + assert_equal({ "foo" => "bar", "fu" => "fufu", "fud" => "biz" }, values) + assert_equal("fufu", @cache.read("fu")) + end + def test_multi_with_objects cache_struct = Struct.new(:cache_key, :title) foo = cache_struct.new("foo", "FOO!") -- cgit v1.2.3