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:
David Taylor 2022-02-17 14:52:14 +00:00 committed by GitHub
parent df96374700
commit ffcd2e9faf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 1 deletions

View File

@ -21,7 +21,7 @@ class DistributedCache < MessageBus::DistributedCache
end
def defer_get_set(k, &block)
return self[k] if self[k]
return self[k] if hash.key? k
value = block.call
self.defer_set(k, value)
value

View 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