Commit 213ee624 authored by Jacob Vosmaer's avatar Jacob Vosmaer

Be careful when setting class instance vars

parent 0163e276
...@@ -2,12 +2,23 @@ module Gitlab ...@@ -2,12 +2,23 @@ module Gitlab
class Redis class Redis
attr_reader :url attr_reader :url
# To be thread-safe we must be careful when writing the class instance
# variables @url and @pool. Because @pool depends on @url we need two
# mutexes to prevent deadlock.
URL_MUTEX = Mutex.new
POOL_MUTEX = Mutex.new
private_constant :URL_MUTEX, :POOL_MUTEX
def self.url def self.url
@url ||= new.url @url || URL_MUTEX.synchronize { @url = new.url }
end end
def self.with def self.with
@pool ||= ConnectionPool.new { ::Redis.new(url: url) } if @pool.nil?
POOL_MUTEX.synchronize do
@pool = ConnectionPool.new { ::Redis.new(url: url) }
end
end
@pool.with { |redis| yield redis } @pool.with { |redis| yield redis }
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment