Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/redis/cluster_util.rb')
-rw-r--r--lib/gitlab/redis/cluster_util.rb32
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/gitlab/redis/cluster_util.rb b/lib/gitlab/redis/cluster_util.rb
new file mode 100644
index 00000000000..5f1f39b5237
--- /dev/null
+++ b/lib/gitlab/redis/cluster_util.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Redis
+ module ClusterUtil
+ class << self
+ # clusters? is used to select Redis command types, on `true`, the subsequent
+ # commands should be compatible with Redis Cluster.
+ #
+ # When working with MultiStore, if even 1 of 2 stores is a Redis::Cluster,
+ # we should err on the side of caution and return `true `,
+ def cluster?(obj)
+ if obj.is_a?(MultiStore)
+ cluster?(obj.primary_store) || cluster?(obj.secondary_store)
+ else
+ obj.respond_to?(:_client) && obj._client.is_a?(::Redis::Cluster)
+ end
+ end
+
+ def batch_unlink(keys, redis)
+ expired_count = 0
+ keys.each_slice(1000) do |subset|
+ expired_count += Gitlab::Redis::CrossSlot::Pipeline.new(redis).pipelined do |pipeline|
+ subset.each { |key| pipeline.unlink(key) }
+ end.sum
+ end
+ expired_count
+ end
+ end
+ end
+ end
+end