Revert "Refactor LocalCache to avoid calling Marshal.dump as much"

This commit is contained in:
Jean byroot Boussier 2021-04-13 18:03:51 +02:00 committed by GitHub
parent e68cd6fe96
commit 62eb0b9c57
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 67 deletions

@ -858,10 +858,6 @@ def bytesize
end
end
def compressed? # :nodoc:
defined?(@compressed)
end
# Duplicates the value in a class. This is used by cache implementations that don't natively
# serialize entries to protect against accidental cache modifications.
def dup_value!
@ -897,6 +893,10 @@ def compress!(compress_threshold)
end
end
def compressed?
defined?(@compressed)
end
def uncompress(value)
Marshal.load(Zlib::Inflate.inflate(value))
end

@ -35,65 +35,6 @@ def self.cache_for(l); instance.cache_for l; end
# Simple memory backed cache. This cache is not thread safe and is intended only
# for serving as a temporary memory cache for a single thread.
class LocalStore < Store
class Entry # :nodoc:
class << self
def build(cache_entry)
return if cache_entry.nil?
return cache_entry if cache_entry.compressed?
value = cache_entry.value
if value.is_a?(String)
DupableEntry.new(cache_entry)
elsif !value || value == true || value.is_a?(Numeric)
new(cache_entry)
else
MutableEntry.new(cache_entry)
end
end
end
attr_reader :value, :version, :expires_at
def initialize(cache_entry)
@value = cache_entry.value
@expires_at = cache_entry.expires_at
@version = cache_entry.version
end
def mismatched?(version)
@version && version && @version != version
end
def expired?
expires_at && expires_at <= Time.now.to_f
end
end
class DupableEntry < Entry # :nodoc:
def initialize(_cache_entry)
super
unless @value.frozen?
@value = @value.dup.freeze
end
end
def value
@value.dup
end
end
class MutableEntry < Entry # :nodoc:
def initialize(cache_entry)
@payload = Marshal.dump(cache_entry.value)
@expires_at = cache_entry.expires_at
@version = cache_entry.version
end
def value
Marshal.load(@payload)
end
end
def initialize
super
@data = {}
@ -124,7 +65,8 @@ def read_multi_entries(keys, **options)
end
def write_entry(key, entry, **options)
@data[key] = Entry.build(entry)
entry.dup_value!
@data[key] = entry
true
end
@ -133,7 +75,10 @@ def delete_entry(key, **options)
end
def fetch_entry(key, options = nil) # :nodoc:
@data.fetch(key) { @data[key] = Entry.build(yield) }
entry = @data.fetch(key) { @data[key] = yield }
dup_entry = entry.dup
dup_entry&.dup_value!
dup_entry
end
end
@ -186,12 +131,12 @@ def decrement(name, amount = 1, **options) # :nodoc:
def read_entry(key, **options)
if cache = local_cache
hit = true
entry = cache.fetch_entry(key) do
value = cache.fetch_entry(key) do
hit = false
super
end
options[:event][:store] = cache.class.name if hit && options[:event]
entry
value
else
super
end