diff options
author | Eugene Kenny <elkenny@gmail.com> | 2017-05-14 23:24:37 +0100 |
---|---|---|
committer | Eugene Kenny <elkenny@gmail.com> | 2017-05-14 23:24:37 +0100 |
commit | db9ae5f1e1449b09c08d55a8a3a21ff61d904bd3 (patch) | |
tree | cd25726d1aca26bb5de9cebca7c0728635e9645c | |
parent | d48008f16438c2c9c9c7295f550568b82b95ef9e (diff) | |
download | rails-db9ae5f1e1449b09c08d55a8a3a21ff61d904bd3.tar.gz rails-db9ae5f1e1449b09c08d55a8a3a21ff61d904bd3.tar.bz2 rails-db9ae5f1e1449b09c08d55a8a3a21ff61d904bd3.zip |
Don't cache locally if unless_exist was passed
Some cache backends support the `unless_exist` option, which tells them
not to overwrite an existing entry. The local cache currently always
stores the new value, even though the backend may have rejected it.
Since we can't tell which value will end up in the backend cache, we
should delete the key from the local cache, so that the next read for
that key will go to the backend and pick up the correct value.
-rw-r--r-- | activesupport/lib/active_support/cache/strategy/local_cache.rb | 7 | ||||
-rw-r--r-- | activesupport/test/caching_test.rb | 8 |
2 files changed, 14 insertions, 1 deletions
diff --git a/activesupport/lib/active_support/cache/strategy/local_cache.rb b/activesupport/lib/active_support/cache/strategy/local_cache.rb index 672eb2bb80..91875a56f5 100644 --- a/activesupport/lib/active_support/cache/strategy/local_cache.rb +++ b/activesupport/lib/active_support/cache/strategy/local_cache.rb @@ -115,7 +115,12 @@ module ActiveSupport end def write_entry(key, entry, options) - local_cache.write_entry(key, entry, options) if local_cache + if options[:unless_exist] + local_cache.delete_entry(key, options) if local_cache + else + local_cache.write_entry(key, entry, options) if local_cache + end + super end diff --git a/activesupport/test/caching_test.rb b/activesupport/test/caching_test.rb index c67ffe69b8..dbec684ce0 100644 --- a/activesupport/test/caching_test.rb +++ b/activesupport/test/caching_test.rb @@ -708,6 +708,14 @@ module LocalCacheBehavior end end + def test_local_cache_of_write_with_unless_exist + @cache.with_local_cache do + @cache.write("foo", "bar") + @cache.write("foo", "baz", unless_exist: true) + assert_equal @peek.read("foo"), @cache.read("foo") + end + end + def test_local_cache_of_delete @cache.with_local_cache do @cache.write("foo", "bar") |