mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 07:53:49 +08:00
FIX: Handle nil
values in DistributedCache#defer_get_set
(#15978)
Themes often cache `nil` values in a DistributedCache. This bug meant that we were re-calculating some values on every request, AND triggering message-bus publishing on every request. This fix should provide a significant performance improvement for busy sites.
This commit is contained in:
@ -21,7 +21,7 @@ class DistributedCache < MessageBus::DistributedCache
|
|||||||
end
|
end
|
||||||
|
|
||||||
def defer_get_set(k, &block)
|
def defer_get_set(k, &block)
|
||||||
return self[k] if self[k]
|
return self[k] if hash.key? k
|
||||||
value = block.call
|
value = block.call
|
||||||
self.defer_set(k, value)
|
self.defer_set(k, value)
|
||||||
value
|
value
|
||||||
|
31
spec/lib/distributed_cache_spec.rb
Normal file
31
spec/lib/distributed_cache_spec.rb
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe "DistributedCache extensions" do
|
||||||
|
let(:cache) { DistributedCache.new('mytest') }
|
||||||
|
|
||||||
|
it "can defer_get_set" do
|
||||||
|
messages = MessageBus.track_publish("/distributed_hash") do
|
||||||
|
cache.defer_get_set("key") { "value" }
|
||||||
|
end
|
||||||
|
expect(messages.size).to eq(1)
|
||||||
|
expect(cache["key"]).to eq("value")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "works correctly for nil values" do
|
||||||
|
block_called_counter = 0
|
||||||
|
messages = MessageBus.track_publish("/distributed_hash") do
|
||||||
|
2.times do
|
||||||
|
cache.defer_get_set("key") do
|
||||||
|
block_called_counter += 1
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
expect(block_called_counter).to eq(1)
|
||||||
|
expect(messages.size).to eq(1)
|
||||||
|
expect(cache["key"]).to eq(nil)
|
||||||
|
end
|
||||||
|
end
|
Reference in New Issue
Block a user