From 3933a41ad5e3c2a1e1cd6683576b84a165954c45 Mon Sep 17 00:00:00 2001 From: Bulat Shakirzyanov <83289+avalanche123@users.noreply.github.com> Date: Tue, 8 Feb 2022 19:19:05 -0500 Subject: [PATCH] fix LocalCache#read_multi_entries In cache stores prepending `LocalCache`, serialized `Entry` instances are stored in `LocalCache::LocalStore`. This speeds up hot key lookups without a network roundtrip in a context of a single given request. However, with these entries being stored in their serialized form, `#read_multi_entries` returns them directly to cache consumers. Instead, we will now deserialize these entries first. --- .../lib/active_support/cache/strategy/local_cache.rb | 3 +++ .../test/cache/behaviors/local_cache_behavior.rb | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/activesupport/lib/active_support/cache/strategy/local_cache.rb b/activesupport/lib/active_support/cache/strategy/local_cache.rb index 0b2e0d78687f3..c89cacdd61dd3 100644 --- a/activesupport/lib/active_support/cache/strategy/local_cache.rb +++ b/activesupport/lib/active_support/cache/strategy/local_cache.rb @@ -123,6 +123,9 @@ def read_multi_entries(keys, **options) return super unless local_cache local_entries = local_cache.read_multi_entries(keys) + local_entries.transform_values! do |payload| + deserialize_entry(payload).value + end missed_keys = keys - local_entries.keys if missed_keys.any? diff --git a/activesupport/test/cache/behaviors/local_cache_behavior.rb b/activesupport/test/cache/behaviors/local_cache_behavior.rb index 968fde93c72ed..c68e0b6d0d01c 100644 --- a/activesupport/test/cache/behaviors/local_cache_behavior.rb +++ b/activesupport/test/cache/behaviors/local_cache_behavior.rb @@ -286,4 +286,13 @@ def test_local_cache_should_read_and_write_false assert_equal false, @cache.read(key) end end + + def test_local_cache_should_deserialize_entries_on_multi_get + keys = Array.new(5) { SecureRandom.uuid } + values = keys.index_with(true) + @cache.with_local_cache do + assert @cache.write_multi(values) + assert_equal values, @cache.read_multi(*keys) + end + end end