Files
gitlabhq/lib/gitlab/redis/cluster_store.rb
2024-02-27 12:08:45 +00:00

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