From e95f40a8b500049cbb4a9449aa394d190ac9c2cb Mon Sep 17 00:00:00 2001 From: Joel Nordell Date: Wed, 3 Jun 2015 17:31:04 -0500 Subject: [PATCH 1/2] Fix bug in #shrink_if_needed. - shifted entry was not being removed from @expires_at - replace if with while, in case somehow the @data length is more than 1 greater than @max_size --- lib/fast_cache/cache.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/fast_cache/cache.rb b/lib/fast_cache/cache.rb index f8153b7..f90b7c2 100644 --- a/lib/fast_cache/cache.rb +++ b/lib/fast_cache/cache.rb @@ -201,8 +201,8 @@ def store_entry(key, entry) end def shrink_if_needed - if @data.length > @max_size - entry = delete(@data.shift) + while @data.length > @max_size + entry = @data.shift.last @expires_at.delete(entry) end end From 04863289f090faf71e58d0614c5eba6cba09adb1 Mon Sep 17 00:00:00 2001 From: Joel Nordell Date: Sun, 15 Nov 2015 17:49:53 -0600 Subject: [PATCH 2/2] add test illustrating the bug in #shrink_if_needed --- spec/lib/fast_cache/cache_spec.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spec/lib/fast_cache/cache_spec.rb b/spec/lib/fast_cache/cache_spec.rb index a96db3f..df8fa7f 100644 --- a/spec/lib/fast_cache/cache_spec.rb +++ b/spec/lib/fast_cache/cache_spec.rb @@ -41,6 +41,14 @@ subject[:a].should eq 10 end + describe '#shrink_if_needed' do + it 'deletes the entry correctly' do + subject[:d] = 4 + subject.instance_variable_get('@data').keys.should =~ [ :b, :c, :d ] + subject.instance_variable_get('@expires_at').values.should =~ [ :b, :c, :d ] + end + end + describe '#fetch' do it 'fetches from the cache when a key is present' do subject.fetch(:a) do