lib/routemaster/redis_broker.rb in routemaster-drain-2.5.2 vs lib/routemaster/redis_broker.rb in routemaster-drain-2.5.3

- old
+ new

@@ -5,37 +5,63 @@ module Routemaster class RedisBroker include Singleton + DEFAULT_NAMESPACE = 'rm'.freeze + def initialize @_connections = {} _cleanup end def get(name, urls: []) _check_for_fork @_connections[name] ||= begin parsed_url = URI.parse(urls.first) - namespace = parsed_url.path.split('/')[2] || 'rm' + namespace = parsed_url.path.split('/')[2] || DEFAULT_NAMESPACE Redis::Namespace.new(namespace, redis: Redis::Distributed.new(urls)) end end def cleanup _cleanup end + # Allow to inject pre-built Redis clients + # + # Before storing a new connection, ensures that any previously + # set client is properly closed. + # + def inject(clients={}) + @_injected_clients = true + clients.each_pair do |name, client| + _close_if_present(@_connections[name]) + @_connections[name] = Redis::Namespace.new(DEFAULT_NAMESPACE, redis: client) + end + end + private + # Do not clean up if the clients are injected by the host application. + # In that case connections should be managed the server or worker processes. + # def _check_for_fork - _cleanup unless Process.pid == @_pid + return if @_injected_clients + return if Process.pid == @_pid + _cleanup end def _cleanup @_pid = Process.pid - @_connections.each_value.map(&:redis).each(&:quit) + @_connections.each_value { |conn| _close_if_present(conn) } @_connections = {} + end + + def _close_if_present(connection) + if connection.respond_to?(:redis) + connection.redis.quit + end end end end