Use Global Mutex, and class instance variables using
``` metric = @_metrics_provider_cache&.[](name) return metric if metric `` acccessor that only slightly slower (<20ns) than direct class variable access
This commit is contained in:
parent
087c9a5e8f
commit
d7edc4b46b
|
@ -2,15 +2,11 @@ module Gitlab
|
||||||
module Metrics
|
module Metrics
|
||||||
module Concern
|
module Concern
|
||||||
extend ActiveSupport::Concern
|
extend ActiveSupport::Concern
|
||||||
|
MUTEX = Mutex.new
|
||||||
included do
|
|
||||||
@_metrics_provider_mutex ||= Mutex.new
|
|
||||||
@_metrics_provider_cache ||= {}
|
|
||||||
end
|
|
||||||
|
|
||||||
class_methods do
|
class_methods do
|
||||||
def reload_metric!(name)
|
def reload_metric!(name)
|
||||||
@_metrics_provider_cache.delete(name)
|
@_metrics_provider_cache&.delete(name)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
@ -22,7 +18,8 @@ module Gitlab
|
||||||
|
|
||||||
define_singleton_method(name) do
|
define_singleton_method(name) do
|
||||||
# avoid unnecessary method call to speed up metric access
|
# avoid unnecessary method call to speed up metric access
|
||||||
return @_metrics_provider_cache[name] if @_metrics_provider_cache.has_key?(name)
|
metric = @_metrics_provider_cache&.[](name)
|
||||||
|
return metric if metric
|
||||||
|
|
||||||
fetch_metric(type, name, opts, &block)
|
fetch_metric(type, name, opts, &block)
|
||||||
end
|
end
|
||||||
|
@ -30,12 +27,14 @@ module Gitlab
|
||||||
|
|
||||||
def fetch_metric(type, name, opts = {}, &block)
|
def fetch_metric(type, name, opts = {}, &block)
|
||||||
# avoid synchronization to speed up metrics access
|
# avoid synchronization to speed up metrics access
|
||||||
return @_metrics_provider_cache[name] if @_metrics_provider_cache.has_key?(name)
|
metric = @_metrics_provider_cache&.[](name)
|
||||||
|
return metric if metric
|
||||||
|
|
||||||
options = MetricOptions.new(opts)
|
options = MetricOptions.new(opts)
|
||||||
options.evaluate(&block)
|
options.evaluate(&block)
|
||||||
|
|
||||||
@_metrics_provider_mutex.synchronize do
|
MUTEX.synchronize do
|
||||||
|
@_metrics_provider_cache ||= {}
|
||||||
@_metrics_provider_cache[name] ||= build_metric!(type, name, options)
|
@_metrics_provider_cache[name] ||= build_metric!(type, name, options)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue