Commit 0047429a authored by Heinrich Lee Yu's avatar Heinrich Lee Yu

Cache project HEAD to prevent unnecessary Gitaly calls

parent aed88cd4
...@@ -9,8 +9,6 @@ module Gitlab ...@@ -9,8 +9,6 @@ module Gitlab
class ProjectPipelineStatus class ProjectPipelineStatus
attr_accessor :sha, :status, :ref, :project, :loaded attr_accessor :sha, :status, :ref, :project, :loaded
delegate :commit, to: :project
def self.load_for_project(project) def self.load_for_project(project)
new(project).tap do |status| new(project).tap do |status|
status.load_status status.load_status
...@@ -18,33 +16,12 @@ module Gitlab ...@@ -18,33 +16,12 @@ module Gitlab
end end
def self.load_in_batch_for_projects(projects) def self.load_in_batch_for_projects(projects)
cached_results_for_projects(projects).zip(projects).each do |result, project| projects.each do |project|
project.pipeline_status = new(project, result) project.pipeline_status = new(project)
project.pipeline_status.load_status project.pipeline_status.load_status
end end
end end
def self.cached_results_for_projects(projects)
result = Gitlab::Redis::Cache.with do |redis|
redis.multi do
projects.each do |project|
cache_key = cache_key_for_project(project)
redis.exists(cache_key)
redis.hmget(cache_key, :sha, :status, :ref)
end
end
end
result.each_slice(2).map do |(cache_key_exists, (sha, status, ref))|
pipeline_info = { sha: sha, status: status, ref: ref }
{ loaded_from_cache: cache_key_exists, pipeline_info: pipeline_info }
end
end
def self.cache_key_for_project(project)
"#{Gitlab::Redis::Cache::CACHE_NAMESPACE}:project:#{project.id}:pipeline_status:#{project.commit&.sha}"
end
def self.update_for_pipeline(pipeline) def self.update_for_pipeline(pipeline)
pipeline_info = { pipeline_info = {
sha: pipeline.sha, sha: pipeline.sha,
...@@ -132,7 +109,13 @@ module Gitlab ...@@ -132,7 +109,13 @@ module Gitlab
end end
def cache_key def cache_key
self.class.cache_key_for_project(project) "#{Gitlab::Redis::Cache::CACHE_NAMESPACE}:project:#{project.id}:pipeline_status:#{commit&.sha}"
end
def commit
return @commit if defined?(@commit)
@commit = project.commit
end end
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment