method
default_serializer
v7.1.3.2 -
Show latest stable
- Class:
ActiveSupport::Cache::MemCacheStore
default_serializer()private
No documentation available.
# File activesupport/lib/active_support/cache/mem_cache_store.rb, line 225
def default_serializer
if Cache.format_version == 6.1
ActiveSupport.deprecator.warn <<~EOM
Support for `config.active_support.cache_format_version = 6.1` has been deprecated and will be removed in Rails 7.2.
Check the Rails upgrade guide at https://guides.rubyonrails.org/upgrading_ruby_on_rails.html#new-activesupport-cache-serialization-format
for more information on how to upgrade.
EOM
Cache::SerializerWithFallback[:passthrough]
else
super
end
end
# Read an entry from the cache.
def read_entry(key, **options)
deserialize_entry(read_serialized_entry(key, **options), **options)
end
def read_serialized_entry(key, **options)
rescue_error_with(nil) do
@data.with { |c| c.get(key, options) }
end
end
# Write an entry to the cache.
def write_entry(key, entry, **options)
write_serialized_entry(key, serialize_entry(entry, **options), **options)
end
def write_serialized_entry(key, payload, **options)
method = options[:unless_exist] ? :add : :set
expires_in = options[:expires_in].to_i
if options[:race_condition_ttl] && expires_in > 0 && !options[:raw]
# Set the memcache expire a few minutes in the future to support race condition ttls on read
expires_in += 5.minutes
end
rescue_error_with false do
# Don't pass compress option to Dalli since we are already dealing with compression.
options.delete(:compress)
@data.with { |c| c.send(method, key, payload, expires_in, **options) }
end
end
# Reads multiple entries from the cache implementation.
def read_multi_entries(names, **options)
keys_to_names = names.index_by { |name| normalize_key(name, options) }
raw_values = begin
@data.with { |c| c.get_multi(keys_to_names.keys) }
rescue Dalli::UnmarshalError
{}
end
values = {}
raw_values.each do |key, value|
entry = deserialize_entry(value, raw: options[:raw])
unless entry.nil? || entry.expired? || entry.mismatched?(normalize_version(keys_to_names[key], options))
begin
values[keys_to_names[key]] = entry.value
rescue DeserializationError
end
end
end
values
end
# Delete an entry from the cache.
def delete_entry(key, **options)
rescue_error_with(false) { @data.with { |c| c.delete(key) } }
end
def serialize_entry(entry, raw: false, **options)
if raw
entry.value.to_s
else
super(entry, raw: raw, **options)
end
end
# Memcache keys are binaries. So we need to force their encoding to binary
# before applying the regular expression to ensure we are escaping all
# characters properly.
def normalize_key(key, options)
key = super
if key
key = key.dup.force_encoding(Encoding::ASCII_8BIT)
key = key.gsub(ESCAPE_KEY_CHARS) { |match| "%#{match.getbyte(0).to_s(16).upcase}" }
if key.size > KEY_MAX_SIZE
key_separator = ":hash:"
key_hash = ActiveSupport::Digest.hexdigest(key)
key_trim_size = KEY_MAX_SIZE - key_separator.size - key_hash.size
key = "#{key[0, key_trim_size]}#{key_separator}#{key_hash}"
end
end
key
end
def deserialize_entry(payload, raw: false, **)
if payload && raw
Entry.new(payload)
else
super(payload)
end
end
def rescue_error_with(fallback)
yield
rescue Dalli::DalliError => error
logger.error("DalliError (#{error}): #{error.message}") if logger
ActiveSupport.error_reporter&.report(
error,
severity: :warning,
source: "mem_cache_store.active_support",
)
fallback
end
end
end