51 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| module Gitlab
 | |
|   class Redis
 | |
|     CACHE_NAMESPACE = 'cache:gitlab'
 | |
|     SESSION_NAMESPACE = 'session:gitlab'
 | |
|     SIDEKIQ_NAMESPACE = 'resque:gitlab'
 | |
| 
 | |
|     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
 | |
|       @url || URL_MUTEX.synchronize { @url = new.url }
 | |
|     end
 | |
| 
 | |
|     def self.with
 | |
|       if @pool.nil?
 | |
|         POOL_MUTEX.synchronize do
 | |
|           @pool = ConnectionPool.new { ::Redis.new(url: url) }
 | |
|         end
 | |
|       end
 | |
|       @pool.with { |redis| yield redis }
 | |
|     end
 | |
| 
 | |
|     def self.redis_store_options
 | |
|       url = new.url
 | |
|       redis_config_hash = ::Redis::Store::Factory.extract_host_options_from_uri(url)
 | |
|       # Redis::Store does not handle Unix sockets well, so let's do it for them
 | |
|       redis_uri = URI.parse(url)
 | |
|       if redis_uri.scheme == 'unix'
 | |
|         redis_config_hash[:path] = redis_uri.path
 | |
|       end
 | |
|       redis_config_hash
 | |
|     end
 | |
| 
 | |
|     def initialize(rails_env = nil)
 | |
|       rails_env ||= Rails.env
 | |
|       config_file = File.expand_path('../../../config/resque.yml', __FILE__)
 | |
| 
 | |
|       @url = "redis://localhost:6379"
 | |
|       if File.exist?(config_file)
 | |
|         @url = YAML.load_file(config_file)[rails_env]
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 |