Add Gitlab::Redis connection pool

This commit is contained in:
Jacob Vosmaer 2016-03-16 18:10:03 +01:00
parent ba7fcc9866
commit 0163e27631
7 changed files with 31 additions and 23 deletions

View file

@ -4,7 +4,7 @@ require 'rails/all'
require 'devise'
I18n.config.enforce_available_locales = false
Bundler.require(:default, Rails.env)
require_relative '../lib/gitlab/redis_config'
require_relative '../lib/gitlab/redis'
module Gitlab
REDIS_CACHE_NAMESPACE = 'cache:gitlab'
@ -69,7 +69,7 @@ module Gitlab
end
end
redis_config_hash = Gitlab::RedisConfig.redis_store_options
redis_config_hash = Gitlab::Redis.redis_store_options
redis_config_hash[:namespace] = REDIS_CACHE_NAMESPACE
redis_config_hash[:expires_in] = 2.weeks # Cache should not grow forever
config.cache_store = :redis_store, redis_config_hash

View file

@ -13,7 +13,7 @@ end
if Rails.env.test?
Gitlab::Application.config.session_store :cookie_store, key: "_gitlab_session"
else
redis_config = Gitlab::RedisConfig.redis_store_options
redis_config = Gitlab::Redis.redis_store_options
redis_config[:namespace] = 'session:gitlab'
Gitlab::Application.config.session_store(

View file

@ -2,7 +2,7 @@ SIDEKIQ_REDIS_NAMESPACE = 'resque:gitlab'
Sidekiq.configure_server do |config|
config.redis = {
url: Gitlab::RedisConfig.url,
url: Gitlab::Redis.url,
namespace: SIDEKIQ_REDIS_NAMESPACE
}
@ -29,7 +29,7 @@ end
Sidekiq.configure_client do |config|
config.redis = {
url: Gitlab::RedisConfig.url,
url: Gitlab::Redis.url,
namespace: SIDEKIQ_REDIS_NAMESPACE
}
end

View file

@ -2,7 +2,7 @@
<%
require "yaml"
require "json"
require_relative "lib/gitlab/redis_config"
require_relative "lib/gitlab/redis"
rails_env = ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development"
@ -18,7 +18,7 @@ if File.exists?(config_file)
config['mailbox'] = "inbox" if config['mailbox'].nil?
if config['enabled'] && config['address']
redis_url = Gitlab::RedisConfig.new(rails_env).url
redis_url = Gitlab::Redis.new(rails_env).url
%>
-
:host: <%= config['host'].to_json %>

View file

@ -43,8 +43,10 @@ module Gitlab
# false if the lease is already taken.
def try_obtain
# Performing a single SET is atomic
Gitlab::Redis.with do |redis|
!!redis.set(redis_key, '1', nx: true, ex: @timeout)
end
end
# No #cancel method. See comments above!

View file

@ -1,14 +1,19 @@
module Gitlab
class RedisConfig
class Redis
attr_reader :url
def self.url
new.url
@url ||= new.url
end
def self.with
@pool ||= ConnectionPool.new { ::Redis.new(url: url) }
@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_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'

View file

@ -4,7 +4,7 @@ namespace :cache do
desc "GitLab | Clear redis cache"
task :clear => :environment do
redis = Redis.new(url: Gitlab::RedisConfig.url)
Gitlab::Redis.with do |redis|
cursor = REDIS_SCAN_START_STOP
loop do
cursor, keys = redis.scan(
@ -19,3 +19,4 @@ namespace :cache do
end
end
end
end