From a0631d7ccd44c48c4bec4546e38883cd0bcc49c5 Mon Sep 17 00:00:00 2001
From: Gregorius Marco <gmarco@gitlab.com>
Date: Fri, 16 Dec 2022 14:59:24 +0700
Subject: [PATCH] Add Gitlab::Redis::RepositoryCache Redis instance

This instance is used to store repository cache data from Repository
model, which was previously stored in Gitlab::Redis::Cache.

Changelog: changed
---
 config/README.md                               | 16 ++++++++--------
 config/application.rb                          |  1 +
 lib/gitlab/redis.rb                            |  1 +
 lib/gitlab/redis/repository_cache.rb           | 12 ++++++++++++
 spec/lib/gitlab/redis/repository_cache_spec.rb |  7 +++++++
 5 files changed, 29 insertions(+), 8 deletions(-)
 create mode 100644 lib/gitlab/redis/repository_cache.rb
 create mode 100644 spec/lib/gitlab/redis/repository_cache_spec.rb

diff --git a/config/README.md b/config/README.md
index f04758fcaeb6a..2ba6df40f1b10 100644
--- a/config/README.md
+++ b/config/README.md
@@ -71,14 +71,14 @@ environment variable.
 An example configuration file for Redis is in this directory under the name
 `resque.yml.example`.
 
-| Name | Fallback instance | Purpose |
-| --- | --- | --- |
-| `cache` | | Volatile non-persistent data |
-| `queues` | | Background job processing queues |
-| `shared_state` | | Persistent application state |
-| `trace_chunks` | `shared_state` | [CI trace chunks](https://docs.gitlab.com/ee/administration/job_logs.html#incremental-logging-architecture) |
-| `rate_limiting` | `cache` | [Rate limiting](https://docs.gitlab.com/ee/user/admin_area/settings/user_and_ip_rate_limits.html) state |
-| `sessions` | `shared_state` | [Sessions](https://docs.gitlab.com/ee/development/session.html#redis)|
+| Name               | Fallback instance | Purpose                                                                                                     |
+|--------------------|-------------------|-------------------------------------------------------------------------------------------------------------|
+| `cache`            |                   | Volatile non-persistent data                                                                                |
+| `queues`           |                   | Background job processing queues                                                                            |
+| `shared_state`     |                   | Persistent application state                                                                                |
+| `trace_chunks`     | `shared_state`    | [CI trace chunks](https://docs.gitlab.com/ee/administration/job_logs.html#incremental-logging-architecture) |
+| `rate_limiting`    | `cache`           | [Rate limiting](https://docs.gitlab.com/ee/user/admin_area/settings/user_and_ip_rate_limits.html) state     |
+| `sessions`         | `shared_state`    | [Sessions](https://docs.gitlab.com/ee/development/session.html#redis)                                       |
 
 If no configuration is found, or no URL is found in the configuration
 file, the default URL used is:
diff --git a/config/application.rb b/config/application.rb
index a3fe4935fdf55..f02aa5723ec2f 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -59,6 +59,7 @@ class Application < Rails::Application
     require_dependency Rails.root.join('lib/gitlab/redis/trace_chunks')
     require_dependency Rails.root.join('lib/gitlab/redis/rate_limiting')
     require_dependency Rails.root.join('lib/gitlab/redis/sessions')
+    require_dependency Rails.root.join('lib/gitlab/redis/repository_cache')
     require_dependency Rails.root.join('lib/gitlab/current_settings')
     require_dependency Rails.root.join('lib/gitlab/middleware/read_only')
     require_dependency Rails.root.join('lib/gitlab/middleware/compressed_json')
diff --git a/lib/gitlab/redis.rb b/lib/gitlab/redis.rb
index 8857b54436486..ed4f60156034f 100644
--- a/lib/gitlab/redis.rb
+++ b/lib/gitlab/redis.rb
@@ -11,6 +11,7 @@ module Redis
       Gitlab::Redis::Cache,
       Gitlab::Redis::Queues,
       Gitlab::Redis::RateLimiting,
+      Gitlab::Redis::RepositoryCache,
       Gitlab::Redis::Sessions,
       Gitlab::Redis::SharedState,
       Gitlab::Redis::TraceChunks
diff --git a/lib/gitlab/redis/repository_cache.rb b/lib/gitlab/redis/repository_cache.rb
new file mode 100644
index 0000000000000..61eaf701e4233
--- /dev/null
+++ b/lib/gitlab/redis/repository_cache.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+module Gitlab
+  module Redis
+    class RepositoryCache < ::Gitlab::Redis::Wrapper
+      # The data we store on RepositoryCache used to be stored on Cache.
+      def self.config_fallback
+        Cache
+      end
+    end
+  end
+end
diff --git a/spec/lib/gitlab/redis/repository_cache_spec.rb b/spec/lib/gitlab/redis/repository_cache_spec.rb
new file mode 100644
index 0000000000000..72ba5647a410c
--- /dev/null
+++ b/spec/lib/gitlab/redis/repository_cache_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Redis::RepositoryCache, feature_category: :scalability do
+  include_examples "redis_new_instance_shared_examples", 'repository_cache', Gitlab::Redis::Cache
+end
-- 
GitLab