summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Vosmaer <jacob@gitlab.com>2016-09-30 12:27:43 +0200
committerJacob Vosmaer <jacob@gitlab.com>2016-09-30 12:27:43 +0200
commit52ee85e7bf35d372285d70cc93016854774839b1 (patch)
treeb18aa064138d2762834c267f20dd4d295660983f
parent7d48778c4f35e61fd3e6e9bfbb476c27f9fb4602 (diff)
downloadgitlab-ce-52ee85e7bf35d372285d70cc93016854774839b1.tar.gz
Initialize Redis pool in single-threaded context
This side-steps the need for mutexes and whatnot.
-rw-r--r--config/initializers/7_redis.rb3
-rw-r--r--lib/gitlab/redis.rb24
2 files changed, 9 insertions, 18 deletions
diff --git a/config/initializers/7_redis.rb b/config/initializers/7_redis.rb
new file mode 100644
index 00000000000..ae2ca258df1
--- /dev/null
+++ b/config/initializers/7_redis.rb
@@ -0,0 +1,3 @@
+# Make sure we initialize a Redis connection pool before Sidekiq starts
+# multi-threaded execution.
+Gitlab::Redis.with { nil }
diff --git a/lib/gitlab/redis.rb b/lib/gitlab/redis.rb
index 69c4ef721d5..3faab937726 100644
--- a/lib/gitlab/redis.rb
+++ b/lib/gitlab/redis.rb
@@ -11,13 +11,6 @@ module Gitlab
DEFAULT_REDIS_URL = 'redis://localhost:6379'
CONFIG_FILE = File.expand_path('../../config/resque.yml', __dir__)
- # To be thread-safe we must be careful when writing the class instance
- # variables @_raw_config and @pool. Because @pool depends on @_raw_config we need two
- # mutexes to prevent deadlock.
- RAW_CONFIG_MUTEX = Mutex.new
- POOL_MUTEX = Mutex.new
- private_constant :RAW_CONFIG_MUTEX, :POOL_MUTEX
-
class << self
# Do NOT cache in an instance variable. Result may be mutated by caller.
def params
@@ -31,24 +24,19 @@ module Gitlab
end
def with
- if @pool.nil?
- POOL_MUTEX.synchronize do
- @pool = ConnectionPool.new { ::Redis.new(params) }
- end
- end
+ @pool ||= ConnectionPool.new { ::Redis.new(params) }
@pool.with { |redis| yield redis }
end
def _raw_config
return @_raw_config if defined?(@_raw_config)
- RAW_CONFIG_MUTEX.synchronize do
- begin
- @_raw_config = File.read(CONFIG_FILE).freeze
- rescue Errno::ENOENT
- @_raw_config = false
- end
+ begin
+ @_raw_config = File.read(CONFIG_FILE).freeze
+ rescue Errno::ENOENT
+ @_raw_config = false
end
+
@_raw_config
end
end