Commit 34bbd710 authored by Douwe Maan's avatar Douwe Maan

Merge branch 'redis-config-parser' into 'master'

Parse config/resque.yml in one place only



See merge request !3140
parents 26541240 570f428b
...@@ -4,6 +4,7 @@ require 'rails/all' ...@@ -4,6 +4,7 @@ require 'rails/all'
require 'devise' require 'devise'
I18n.config.enforce_available_locales = false I18n.config.enforce_available_locales = false
Bundler.require(:default, Rails.env) Bundler.require(:default, Rails.env)
require_relative '../lib/gitlab/redis_config'
module Gitlab module Gitlab
REDIS_CACHE_NAMESPACE = 'cache:gitlab' REDIS_CACHE_NAMESPACE = 'cache:gitlab'
...@@ -67,22 +68,7 @@ module Gitlab ...@@ -67,22 +68,7 @@ module Gitlab
end end
end end
# Use Redis caching across all environments redis_config_hash = Gitlab::RedisConfig.redis_store_options
redis_config_file = Rails.root.join('config', 'resque.yml')
redis_url_string = if File.exists?(redis_config_file)
YAML.load_file(redis_config_file)[Rails.env]
else
"redis://localhost:6379"
end
# Redis::Store does not handle Unix sockets well, so let's do it for them
redis_config_hash = Redis::Store::Factory.extract_host_options_from_uri(redis_url_string)
redis_uri = URI.parse(redis_url_string)
if redis_uri.scheme == 'unix'
redis_config_hash[:path] = redis_uri.path
end
redis_config_hash[:namespace] = REDIS_CACHE_NAMESPACE redis_config_hash[:namespace] = REDIS_CACHE_NAMESPACE
redis_config_hash[:expires_in] = 2.weeks # Cache should not grow forever redis_config_hash[:expires_in] = 2.weeks # Cache should not grow forever
config.cache_store = :redis_store, redis_config_hash config.cache_store = :redis_store, redis_config_hash
......
...@@ -13,9 +13,12 @@ end ...@@ -13,9 +13,12 @@ end
if Rails.env.test? if Rails.env.test?
Gitlab::Application.config.session_store :cookie_store, key: "_gitlab_session" Gitlab::Application.config.session_store :cookie_store, key: "_gitlab_session"
else else
redis_config = Gitlab::RedisConfig.redis_store_options
redis_config[:namespace] = 'session:gitlab'
Gitlab::Application.config.session_store( Gitlab::Application.config.session_store(
:redis_store, # Using the cookie_store would enable session replay attacks. :redis_store, # Using the cookie_store would enable session replay attacks.
servers: Rails.application.config.cache_store[1].merge(namespace: 'session:gitlab'), # re-use the Redis config from the Rails cache store servers: redis_config,
key: '_gitlab_session', key: '_gitlab_session',
secure: Gitlab.config.gitlab.https, secure: Gitlab.config.gitlab.https,
httponly: true, httponly: true,
......
# Custom Redis configuration SIDEKIQ_REDIS_NAMESPACE = 'resque:gitlab'
config_file = Rails.root.join('config', 'resque.yml')
resque_url = if File.exists?(config_file)
YAML.load_file(config_file)[Rails.env]
else
"redis://localhost:6379"
end
Sidekiq.configure_server do |config| Sidekiq.configure_server do |config|
config.redis = { config.redis = {
url: resque_url, url: Gitlab::RedisConfig.url,
namespace: 'resque:gitlab' namespace: SIDEKIQ_REDIS_NAMESPACE
} }
config.server_middleware do |chain| config.server_middleware do |chain|
...@@ -36,7 +29,7 @@ end ...@@ -36,7 +29,7 @@ end
Sidekiq.configure_client do |config| Sidekiq.configure_client do |config|
config.redis = { config.redis = {
url: resque_url, url: Gitlab::RedisConfig.url,
namespace: 'resque:gitlab' namespace: SIDEKIQ_REDIS_NAMESPACE
} }
end end
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
<% <%
require "yaml" require "yaml"
require "json" require "json"
require_relative "lib/gitlab/redis_config"
rails_env = ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development" rails_env = ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development"
...@@ -17,13 +18,7 @@ if File.exists?(config_file) ...@@ -17,13 +18,7 @@ if File.exists?(config_file)
config['mailbox'] = "inbox" if config['mailbox'].nil? config['mailbox'] = "inbox" if config['mailbox'].nil?
if config['enabled'] && config['address'] && config['address'].include?('%{key}') if config['enabled'] && config['address'] && config['address'].include?('%{key}')
redis_config_file = "config/resque.yml" redis_url = Gitlab::RedisConfig.new(rails_env).url
redis_url =
if File.exists?(redis_config_file)
YAML.load_file(redis_config_file)[rails_env]
else
"redis://localhost:6379"
end
%> %>
- -
:host: <%= config['host'].to_json %> :host: <%= config['host'].to_json %>
......
module Gitlab
class RedisConfig
attr_reader :url
def self.url
new.url
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.exists?(config_file)
@url =YAML.load_file(config_file)[rails_env]
end
end
end
end
...@@ -4,16 +4,16 @@ namespace :cache do ...@@ -4,16 +4,16 @@ namespace :cache do
desc "GitLab | Clear redis cache" desc "GitLab | Clear redis cache"
task :clear => :environment do task :clear => :environment do
redis_store = Rails.cache.instance_variable_get(:@data) redis = Redis.new(url: Gitlab::RedisConfig.url)
cursor = REDIS_SCAN_START_STOP cursor = REDIS_SCAN_START_STOP
loop do loop do
cursor, keys = redis_store.scan( cursor, keys = redis.scan(
cursor, cursor,
match: "#{Gitlab::REDIS_CACHE_NAMESPACE}*", match: "#{Gitlab::REDIS_CACHE_NAMESPACE}*",
count: CLEAR_BATCH_SIZE count: CLEAR_BATCH_SIZE
) )
redis_store.del(*keys) if keys.any? redis.del(*keys) if keys.any?
break if cursor == REDIS_SCAN_START_STOP break if cursor == REDIS_SCAN_START_STOP
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