mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Skip the :race_condition_ttl
branch if the option is 0 or nil. This fixes an issue with the redis cache, where this code will sometimes throw an error out of SETEX when passing 0 as the expires_at
.
This commit is contained in:
parent
1b7ae86f26
commit
23767c0c41
2 changed files with 22 additions and 10 deletions
|
@ -566,8 +566,8 @@ module ActiveSupport
|
||||||
def handle_expired_entry(entry, key, options)
|
def handle_expired_entry(entry, key, options)
|
||||||
if entry && entry.expired?
|
if entry && entry.expired?
|
||||||
race_ttl = options[:race_condition_ttl].to_i
|
race_ttl = options[:race_condition_ttl].to_i
|
||||||
if race_ttl && (Time.now.to_f - entry.expires_at <= race_ttl)
|
if (race_ttl > 0) && (Time.now.to_f - entry.expires_at <= race_ttl)
|
||||||
# When an entry has :race_condition_ttl defined, put the stale entry back into the cache
|
# When an entry has a positive :race_condition_ttl defined, put the stale entry back into the cache
|
||||||
# for a brief period while the entry is being recalculated.
|
# for a brief period while the entry is being recalculated.
|
||||||
entry.expires_at = Time.now + race_ttl
|
entry.expires_at = Time.now + race_ttl
|
||||||
write_entry(key, entry, :expires_in => race_ttl * 2)
|
write_entry(key, entry, :expires_in => race_ttl * 2)
|
||||||
|
|
|
@ -399,15 +399,16 @@ module CacheStoreBehavior
|
||||||
assert_nil @cache.read('foo')
|
assert_nil @cache.read('foo')
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_race_condition_protection
|
def test_race_condition_protection_skipped_if_not_defined
|
||||||
time = Time.now
|
@cache.write('foo', 'bar')
|
||||||
@cache.write('foo', 'bar', :expires_in => 60)
|
time = @cache.send(:read_entry, 'foo', {}).expires_at
|
||||||
Time.stubs(:now).returns(time + 61)
|
Time.stubs(:now).returns(Time.at(time))
|
||||||
result = @cache.fetch('foo', :race_condition_ttl => 10) do
|
|
||||||
assert_equal 'bar', @cache.read('foo')
|
result = @cache.fetch('foo') do
|
||||||
"baz"
|
assert_equal nil, @cache.read('foo')
|
||||||
|
'baz'
|
||||||
end
|
end
|
||||||
assert_equal "baz", result
|
assert_equal 'baz', result
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_race_condition_protection_is_limited
|
def test_race_condition_protection_is_limited
|
||||||
|
@ -437,6 +438,17 @@ module CacheStoreBehavior
|
||||||
assert_nil @cache.read('foo')
|
assert_nil @cache.read('foo')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_race_condition_protection
|
||||||
|
time = Time.now
|
||||||
|
@cache.write('foo', 'bar', :expires_in => 60)
|
||||||
|
Time.stubs(:now).returns(time + 61)
|
||||||
|
result = @cache.fetch('foo', :race_condition_ttl => 10) do
|
||||||
|
assert_equal 'bar', @cache.read('foo')
|
||||||
|
"baz"
|
||||||
|
end
|
||||||
|
assert_equal "baz", result
|
||||||
|
end
|
||||||
|
|
||||||
def test_crazy_key_characters
|
def test_crazy_key_characters
|
||||||
crazy_key = "#/:*(<+=> )&$%@?;'\"\'`~-"
|
crazy_key = "#/:*(<+=> )&$%@?;'\"\'`~-"
|
||||||
assert @cache.write(crazy_key, "1", :raw => true)
|
assert @cache.write(crazy_key, "1", :raw => true)
|
||||||
|
|
Loading…
Reference in a new issue