From 68b946e3c8d3a1e7463cf8923ecd748f33c8ccee Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Thu, 1 Jun 2017 01:46:19 +0200 Subject: [PATCH] Fix circular dependency condition with `current_application_settings` `current_application_settings` used by `influx_metrics_enabled` executed a markdown parsing code that was measured using `Gitlab::Metrics.measure` But since the Gitlab::Metrics::InfluxDb was not yet build so Gitlab::Metrics did not yet have `measure` method. Causing the NoMethodError. However If run was successful at least once then result was cached in a file and this code never executed again. Which caused this issue to only show up in CI preparation step. --- lib/gitlab/metrics/influx_db.rb | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/lib/gitlab/metrics/influx_db.rb b/lib/gitlab/metrics/influx_db.rb index c5d7a2b56b9..3a39791edbf 100644 --- a/lib/gitlab/metrics/influx_db.rb +++ b/lib/gitlab/metrics/influx_db.rb @@ -1,7 +1,11 @@ module Gitlab module Metrics module InfluxDb - include Gitlab::CurrentSettings + extend Gitlab::CurrentSettings + extend self + + MUTEX = Mutex.new + private_constant :MUTEX def influx_metrics_enabled? settings[:enabled] || false @@ -35,10 +39,6 @@ module Gitlab @method_call_threshold ||= settings[:method_call_threshold] end - def pool - @pool - end - def submit_metrics(metrics) prepared = prepare_metrics(metrics) @@ -143,21 +143,28 @@ module Gitlab end # Allow access from other metrics related middlewares - def current_transaction + def current_transaction Transaction.current end # When enabled this should be set before being used as the usual pattern # "@foo ||= bar" is _not_ thread-safe. - if influx_metrics_enabled? - @pool = ConnectionPool.new(size: settings[:pool_size], timeout: settings[:timeout]) do - host = settings[:host] - port = settings[:port] + def pool + if influx_metrics_enabled? + if @pool.nil? + MUTEX.synchronize do + @pool ||= ConnectionPool.new(size: settings[:pool_size], timeout: settings[:timeout]) do + host = settings[:host] + port = settings[:port] - InfluxDB::Client. - new(udp: { host: host, port: port }) + InfluxDB::Client. + new(udp: { host: host, port: port }) + end + end + end + @pool end end end end -end \ No newline at end of file +end