diff options
author | Ignatius Reza <lyoneil.de.sire@gmail.com> | 2017-08-18 09:32:19 +0900 |
---|---|---|
committer | Ignatius Reza <lyoneil.de.sire@gmail.com> | 2017-12-29 10:12:32 +0900 |
commit | 62023884f76c108127c8966f4d67bb717338dd66 (patch) | |
tree | f06fff52fc7f16c3c2c4371d43a55758ee7bdba7 /activesupport/lib/active_support/cache.rb | |
parent | dab7d401e8dd6192e36787f7b5b574d30b368388 (diff) | |
download | rails-62023884f76c108127c8966f4d67bb717338dd66.tar.gz rails-62023884f76c108127c8966f4d67bb717338dd66.tar.bz2 rails-62023884f76c108127c8966f4d67bb717338dd66.zip |
add instrumentation for read_multi
currently it's not possible to know what the hit rates are from read_multi
Diffstat (limited to 'activesupport/lib/active_support/cache.rb')
-rw-r--r-- | activesupport/lib/active_support/cache.rb | 57 |
1 files changed, 36 insertions, 21 deletions
diff --git a/activesupport/lib/active_support/cache.rb b/activesupport/lib/active_support/cache.rb index 8301b8c7cb..2d038dba77 100644 --- a/activesupport/lib/active_support/cache.rb +++ b/activesupport/lib/active_support/cache.rb @@ -357,23 +357,11 @@ module ActiveSupport options = names.extract_options! options = merged_options(options) - results = {} - names.each do |name| - key = normalize_key(name, options) - version = normalize_version(name, options) - entry = read_entry(key, options) - - if entry - if entry.expired? - delete_entry(key, options) - elsif entry.mismatched?(version) - # Skip mismatched versions - else - results[name] = entry.value - end + instrument :read_multi, names, options do |payload| + read_multi_entries(names, options).tap do |results| + payload[:hits] = results.keys end end - results end # Cache Storage API to write multiple values at once. @@ -414,14 +402,19 @@ module ActiveSupport options = names.extract_options! options = merged_options(options) - read_multi(*names, options).tap do |results| - writes = {} + instrument :read_multi, names, options do |payload| + read_multi_entries(names, options).tap do |results| + payload[:hits] = results.keys + payload[:super_operation] = :fetch_multi - (names - results.keys).each do |name| - results[name] = writes[name] = yield(name) - end + writes = {} - write_multi writes, options + (names - results.keys).each do |name| + results[name] = writes[name] = yield(name) + end + + write_multi writes, options + end end end @@ -538,6 +531,28 @@ module ActiveSupport raise NotImplementedError.new end + # Reads multiple entries from the cache implementation. Subclasses MAY + # implement this method. + def read_multi_entries(names, options) + results = {} + names.each do |name| + key = normalize_key(name, options) + version = normalize_version(name, options) + entry = read_entry(key, options) + + if entry + if entry.expired? + delete_entry(key, options) + elsif entry.mismatched?(version) + # Skip mismatched versions + else + results[name] = entry.value + end + end + end + results + end + # Writes multiple entries to the cache implementation. Subclasses MAY # implement this method. def write_multi_entries(hash, options) |