From c807a41849ad83e2a8ad3f206c454a46bff602d2 Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Wed, 25 Jul 2018 19:03:18 +0900 Subject: [PATCH] Backport reactive caching --- app/models/concerns/reactive_caching.rb | 10 ++++++++-- spec/models/concerns/reactive_caching_spec.rb | 7 +++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/models/concerns/reactive_caching.rb b/app/models/concerns/reactive_caching.rb index be0a5b49012..9155d82d567 100644 --- a/app/models/concerns/reactive_caching.rb +++ b/app/models/concerns/reactive_caching.rb @@ -59,6 +59,9 @@ module ReactiveCaching raise NotImplementedError end + def reactive_cache_updated(*args) + end + def with_reactive_cache(*args, &blk) bootstrap = !within_reactive_cache_lifetime?(*args) Rails.cache.write(alive_reactive_cache_key(*args), true, expires_in: self.class.reactive_cache_lifetime) @@ -81,8 +84,11 @@ module ReactiveCaching locking_reactive_cache(*args) do if within_reactive_cache_lifetime?(*args) enqueuing_update(*args) do - value = calculate_reactive_cache(*args) - Rails.cache.write(full_reactive_cache_key(*args), value) + key = full_reactive_cache_key(*args) + new_value = calculate_reactive_cache(*args) + old_value = Rails.cache.read(key) + Rails.cache.write(key, new_value) + reactive_cache_updated(*args) if new_value != old_value end end end diff --git a/spec/models/concerns/reactive_caching_spec.rb b/spec/models/concerns/reactive_caching_spec.rb index 0f156619e9e..79f75c0ffa0 100644 --- a/spec/models/concerns/reactive_caching_spec.rb +++ b/spec/models/concerns/reactive_caching_spec.rb @@ -125,6 +125,13 @@ describe ReactiveCaching, :use_clean_rails_memory_store_caching do go! end + it "calls a reactive_cache_updated only once if content did not change on subsequent update" do + expect(instance).to receive(:calculate_reactive_cache).twice + expect(instance).to receive(:reactive_cache_updated).once + + 2.times { instance.exclusively_update_reactive_cache! } + end + context 'and #calculate_reactive_cache raises an exception' do before do stub_reactive_cache(instance, "preexisting")