diff options
Diffstat (limited to 'lib/gitlab/repository_cache/preloader.rb')
-rw-r--r-- | lib/gitlab/repository_cache/preloader.rb | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/gitlab/repository_cache/preloader.rb b/lib/gitlab/repository_cache/preloader.rb new file mode 100644 index 00000000000..726dde4e0ca --- /dev/null +++ b/lib/gitlab/repository_cache/preloader.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +module Gitlab + class RepositoryCache + class Preloader + def initialize(repositories) + @repositories = repositories + end + + def preload(methods) + return if @repositories.empty? + + cache_keys = [] + + sources_by_cache_key = @repositories.each_with_object({}) do |repository, hash| + methods.each do |method| + cache_key = repository.cache.cache_key(method) + + hash[cache_key] = { repository: repository, method: method } + cache_keys << cache_key + end + end + + Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do + backend.read_multi(*cache_keys).each do |cache_key, value| + source = sources_by_cache_key[cache_key] + + source[:repository].memoize_method_cache_value(source[:method], value) + end + end + end + + private + + def backend + @repositories.first.cache.backend + end + end + end +end |