Skip to content

Commit

Permalink
Change ActiveSupport::Cache behavior to always return duplicate objec…
Browse files Browse the repository at this point in the history
…ts instead of frozen objects.
  • Loading branch information
Brian Durand authored and fxn committed Aug 13, 2011
1 parent f85b966 commit 48fce08
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 22 deletions.
23 changes: 8 additions & 15 deletions activesupport/lib/active_support/cache.rb
Expand Up @@ -557,15 +557,14 @@ def initialize(value, options = {})
@expires_in = options[:expires_in]
@expires_in = @expires_in.to_f if @expires_in
@created_at = Time.now.to_f
if defined?(value)
if value.nil?
@value = nil
else
@value = Marshal.dump(value)
if should_compress?(value, options)
@value = Zlib::Deflate.deflate(Marshal.dump(value))
@value = Zlib::Deflate.deflate(@value)
@compressed = true
else
@value = value
end
else
@value = nil
end
end

Expand All @@ -576,12 +575,8 @@ def raw_value

# Get the value stored in the cache.
def value
if defined?(@value)
val = compressed? ? Marshal.load(Zlib::Inflate.inflate(@value)) : @value
unless val.frozen?
val.freeze rescue nil
end
val
if @value
Marshal.load(compressed? ? Zlib::Inflate.inflate(@value) : @value)
end
end

Expand Down Expand Up @@ -614,10 +609,8 @@ def expires_at
def size
if @value.nil?
0
elsif @value.respond_to?(:bytesize)
@value.bytesize
else
Marshal.dump(@value).bytesize
@value.bytesize
end
end

Expand Down
17 changes: 10 additions & 7 deletions activesupport/test/caching_test.rb
Expand Up @@ -204,7 +204,7 @@ def test_read_and_write_compressed_small_data
@cache.write('foo', 'bar', :compress => true)
raw_value = @cache.send(:read_entry, 'foo', {}).raw_value
assert_equal 'bar', @cache.read('foo')
assert_equal 'bar', raw_value
assert_equal 'bar', Marshal.load(raw_value)
end

def test_read_and_write_compressed_large_data
Expand Down Expand Up @@ -270,10 +270,12 @@ def test_delete
assert !@cache.exist?('foo')
end

def test_store_objects_should_be_immutable
def test_read_should_return_a_different_object_id_each_time_it_is_called
@cache.write('foo', 'bar')
assert_raise(ActiveSupport::FrozenObjectError) { @cache.read('foo').gsub!(/.*/, 'baz') }
assert_equal 'bar', @cache.read('foo')
assert_not_equal @cache.read('foo').object_id, @cache.read('foo').object_id
value = @cache.read('foo')
value << 'bingo'
assert_not_equal value, @cache.read('foo')
end

def test_original_store_objects_should_not_be_immutable
Expand Down Expand Up @@ -551,7 +553,8 @@ def test_key_transformation_with_pathname

class MemoryStoreTest < ActiveSupport::TestCase
def setup
@cache = ActiveSupport::Cache.lookup_store(:memory_store, :expires_in => 60, :size => 100)
@record_size = Marshal.dump("aaaaaaaaaa").bytesize
@cache = ActiveSupport::Cache.lookup_store(:memory_store, :expires_in => 60, :size => @record_size * 10)
end

include CacheStoreBehavior
Expand All @@ -566,7 +569,7 @@ def test_prune_size
@cache.write(5, "eeeeeeeeee") && sleep(0.001)
@cache.read(2) && sleep(0.001)
@cache.read(4)
@cache.prune(30)
@cache.prune(@record_size * 3)
assert_equal true, @cache.exist?(5)
assert_equal true, @cache.exist?(4)
assert_equal false, @cache.exist?(3)
Expand Down Expand Up @@ -719,7 +722,7 @@ def test_compress_values
def test_non_compress_values
entry = ActiveSupport::Cache::Entry.new("value")
assert_equal "value", entry.value
assert_equal "value", entry.raw_value
assert_equal "value", Marshal.load(entry.raw_value)
assert_equal false, entry.compressed?
end
end

0 comments on commit 48fce08

Please sign in to comment.