提交 0450642c 编写于 作者: J Jeremy Daer

Merge pull request #21631 from RobinClowers/fix-cache-instrumentation

Fix cache fetch instrumentation
* `Cache#fetch` instrumentation marks whether it was a `:hit`.
*Robin Clowers*
* `assert_difference` and `assert_no_difference` now returns the result of the
yielded block.
......
......@@ -277,13 +277,18 @@ def fetch(name, options = nil)
options = merged_options(options)
key = namespaced_key(name, options)
cached_entry = find_cached_entry(key, name, options) unless options[:force]
entry = handle_expired_entry(cached_entry, key, options)
instrument(:read, name, options) do |payload|
cached_entry = read_entry(key, options) unless options[:force]
payload[:super_operation] = :fetch if payload
entry = handle_expired_entry(cached_entry, key, options)
if entry
get_entry_value(entry, name, options)
else
save_block_result_to_cache(name, options) { |_name| yield _name }
if entry
payload[:hit] = true if payload
get_entry_value(entry, name, options)
else
payload[:hit] = false if payload
save_block_result_to_cache(name, options) { |_name| yield _name }
end
end
else
read(name, options)
......@@ -556,13 +561,6 @@ def log
logger.debug(yield)
end
def find_cached_entry(key, name, options)
instrument(:read, name, options) do |payload|
payload[:super_operation] = :fetch if payload
read_entry(key, options)
end
end
def handle_expired_entry(entry, key, options)
if entry && entry.expired?
race_ttl = options[:race_condition_ttl].to_i
......
......@@ -490,6 +490,34 @@ def test_really_long_keys
assert_equal({key => "bar"}, @cache.read_multi(key))
assert @cache.delete(key)
end
def test_cache_hit_instrumentation
key = "test_key"
subscribe_executed = false
ActiveSupport::Notifications.subscribe "cache_read.active_support" do |name, start, finish, id, payload|
subscribe_executed = true
assert_equal :fetch, payload[:super_operation]
assert payload[:hit]
end
assert @cache.write(key, "1", :raw => true)
assert @cache.fetch(key) {}
assert subscribe_executed
ensure
ActiveSupport::Notifications.unsubscribe "cache_read.active_support"
end
def test_cache_miss_instrumentation
subscribe_executed = false
ActiveSupport::Notifications.subscribe "cache_read.active_support" do |name, start, finish, id, payload|
subscribe_executed = true
assert_equal :fetch, payload[:super_operation]
assert_not payload[:hit]
end
assert_not @cache.fetch("bad_key") {}
assert subscribe_executed
ensure
ActiveSupport::Notifications.unsubscribe "cache_read.active_support"
end
end
# https://rails.lighthouseapp.com/projects/8994/tickets/6225-memcachestore-cant-deal-with-umlauts-and-special-characters
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册