82 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| require 'redis-clustering'
 | |
| require 'redis/store/ttl'
 | |
| require 'redis/store/interface'
 | |
| require 'redis/store/namespace'
 | |
| require 'redis/store/serialization'
 | |
| 
 | |
| module Gitlab
 | |
|   module Redis
 | |
|     class ClusterStore < ::Redis::Cluster
 | |
|       include ::Redis::Store::Interface
 | |
| 
 | |
|       def initialize(options = {})
 | |
|         orig_options = options.dup
 | |
| 
 | |
|         @serializer = orig_options.key?(:serializer) ? orig_options.delete(:serializer) : Marshal
 | |
| 
 | |
|         unless orig_options[:marshalling].nil?
 | |
|           # `marshalling` only used here, might not be supported in `super`
 | |
|           @serializer = orig_options.delete(:marshalling) ? Marshal : nil
 | |
|         end
 | |
| 
 | |
|         _remove_unsupported_options(options)
 | |
|         super(options)
 | |
| 
 | |
|         _extend_marshalling
 | |
|         _extend_namespace orig_options
 | |
|       end
 | |
| 
 | |
|       # copies ::Redis::Store::Ttl implementation in a redis-v5 compatible manner
 | |
|       def set(key, value, options = nil)
 | |
|         ttl = get_ttl(options)
 | |
|         if ttl
 | |
|           setex(key, ttl.to_i, value, raw: true)
 | |
|         else
 | |
|           super(key, value)
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       # copies ::Redis::Store::Ttl implementation in a redis-v5 compatible manner
 | |
|       def setnx(key, value, options = nil)
 | |
|         ttl = get_ttl(options)
 | |
|         if ttl
 | |
|           multi do |m|
 | |
|             m.setnx(key, value)
 | |
|             m.expire(key, ttl)
 | |
|           end
 | |
|         else
 | |
|           super(key, value)
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       private
 | |
| 
 | |
|       def get_ttl(options)
 | |
|         # https://github.com/redis-store/redis-store/blob/v1.10.0/lib/redis/store/ttl.rb#L37
 | |
|         options[:expire_after] || options[:expires_in] || options[:expire_in] if options
 | |
|       end
 | |
| 
 | |
|       def _remove_unsupported_options(options)
 | |
|         # Unsupported keywords should be removed to avoid errors
 | |
|         # https://github.com/redis-rb/redis-client/blob/v0.13.0/lib/redis_client/config.rb#L21
 | |
|         options.delete(:raw)
 | |
|         options.delete(:serializer)
 | |
|         options.delete(:marshalling)
 | |
|         options.delete(:namespace)
 | |
|         options.delete(:scheme)
 | |
|       end
 | |
| 
 | |
|       def _extend_marshalling
 | |
|         extend ::Redis::Store::Serialization unless @serializer.nil?
 | |
|       end
 | |
| 
 | |
|       def _extend_namespace(options)
 | |
|         @namespace = options[:namespace]
 | |
|         extend ::Redis::Store::Namespace
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 |