Remove old request store wrap
This commit is contained in:
parent
3c7cb6ad9e
commit
3c34a0b99b
2 changed files with 0 additions and 167 deletions
60
lib/gitlab/cache/request_store_wrap.rb
vendored
60
lib/gitlab/cache/request_store_wrap.rb
vendored
|
@ -1,60 +0,0 @@
|
|||
module Gitlab
|
||||
module Cache
|
||||
# This module provides a simple way to cache values in RequestStore,
|
||||
# and the cache key would be based on the class name, method name,
|
||||
# customized instance level values, and arguments.
|
||||
#
|
||||
# A simple example:
|
||||
#
|
||||
# class UserAccess
|
||||
# extend Gitlab::Cache::RequestStoreWrap
|
||||
#
|
||||
# request_store_wrap_key do
|
||||
# [user.id, project.id]
|
||||
# end
|
||||
#
|
||||
# request_store_wrap def can_push_to_branch?(ref)
|
||||
# # ...
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# This way, the result of `can_push_to_branch?` would be cached in
|
||||
# `RequestStore.store` based on the cache key.
|
||||
module RequestStoreWrap
|
||||
def self.extended(klass)
|
||||
return if klass < self
|
||||
|
||||
extension = Module.new
|
||||
klass.const_set(:RequestStoreWrapExtension, extension)
|
||||
klass.prepend(extension)
|
||||
end
|
||||
|
||||
def request_store_wrap_key(&block)
|
||||
if block_given?
|
||||
@request_store_wrap_key = block
|
||||
else
|
||||
@request_store_wrap_key
|
||||
end
|
||||
end
|
||||
|
||||
def request_store_wrap(method_name)
|
||||
const_get(:RequestStoreWrapExtension)
|
||||
.send(:define_method, method_name) do |*args|
|
||||
return super(*args) unless RequestStore.active?
|
||||
|
||||
klass = self.class
|
||||
key = [klass.name,
|
||||
method_name,
|
||||
*instance_exec(&klass.request_store_wrap_key),
|
||||
*args].join(':')
|
||||
|
||||
if RequestStore.store.key?(key)
|
||||
RequestStore.store[key]
|
||||
else
|
||||
RequestStore.store[key] = super(*args)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
107
spec/lib/gitlab/cache/request_store_wrap_spec.rb
vendored
107
spec/lib/gitlab/cache/request_store_wrap_spec.rb
vendored
|
@ -1,107 +0,0 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Gitlab::Cache::RequestStoreWrap, :request_store do
|
||||
class ExpensiveAlgorithm
|
||||
extend Gitlab::Cache::RequestStoreWrap
|
||||
|
||||
attr_accessor :id, :name, :result
|
||||
|
||||
def initialize(id, name, result)
|
||||
self.id = id
|
||||
self.name = name
|
||||
self.result = result
|
||||
end
|
||||
|
||||
request_store_wrap_key do
|
||||
[id, name]
|
||||
end
|
||||
|
||||
request_store_wrap def compute(arg)
|
||||
result << arg
|
||||
end
|
||||
|
||||
request_store_wrap def repute(arg)
|
||||
result << arg
|
||||
end
|
||||
end
|
||||
|
||||
let(:algorithm) { ExpensiveAlgorithm.new('id', 'name', []) }
|
||||
|
||||
context 'when RequestStore is active' do
|
||||
it 'does not compute twice for the same argument' do
|
||||
result = algorithm.compute(true)
|
||||
|
||||
expect(result).to eq([true])
|
||||
expect(algorithm.compute(true)).to eq(result)
|
||||
expect(algorithm.result).to eq(result)
|
||||
end
|
||||
|
||||
it 'computes twice for the different argument' do
|
||||
algorithm.compute(true)
|
||||
result = algorithm.compute(false)
|
||||
|
||||
expect(result).to eq([true, false])
|
||||
expect(algorithm.result).to eq(result)
|
||||
end
|
||||
|
||||
it 'computes twice for the different keys, id' do
|
||||
algorithm.compute(true)
|
||||
algorithm.id = 'ad'
|
||||
result = algorithm.compute(true)
|
||||
|
||||
expect(result).to eq([true, true])
|
||||
expect(algorithm.result).to eq(result)
|
||||
end
|
||||
|
||||
it 'computes twice for the different keys, name' do
|
||||
algorithm.compute(true)
|
||||
algorithm.name = 'same'
|
||||
result = algorithm.compute(true)
|
||||
|
||||
expect(result).to eq([true, true])
|
||||
expect(algorithm.result).to eq(result)
|
||||
end
|
||||
|
||||
it 'computes twice for the different class name' do
|
||||
algorithm.compute(true)
|
||||
allow(ExpensiveAlgorithm).to receive(:name).and_return('CheapAlgo')
|
||||
result = algorithm.compute(true)
|
||||
|
||||
expect(result).to eq([true, true])
|
||||
expect(algorithm.result).to eq(result)
|
||||
end
|
||||
|
||||
it 'computes twice for the different method' do
|
||||
algorithm.compute(true)
|
||||
result = algorithm.repute(true)
|
||||
|
||||
expect(result).to eq([true, true])
|
||||
expect(algorithm.result).to eq(result)
|
||||
end
|
||||
|
||||
it 'computes twice if RequestStore starts over' do
|
||||
algorithm.compute(true)
|
||||
RequestStore.end!
|
||||
RequestStore.clear!
|
||||
RequestStore.begin!
|
||||
result = algorithm.compute(true)
|
||||
|
||||
expect(result).to eq([true, true])
|
||||
expect(algorithm.result).to eq(result)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when RequestStore is inactive' do
|
||||
before do
|
||||
RequestStore.end!
|
||||
end
|
||||
|
||||
it 'computes twice even if everything is the same' do
|
||||
algorithm.compute(true)
|
||||
result = algorithm.compute(true)
|
||||
|
||||
expect(result).to eq([true, true])
|
||||
expect(algorithm.result).to eq(result)
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue