summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeinrich Lee Yu <heinrich@gitlab.com>2018-11-23 00:21:31 +0800
committerHeinrich Lee Yu <heinrich@gitlab.com>2018-11-26 17:41:39 +0800
commit0047429a97099a43aa0e54ae40c2a9b2d6e7f897 (patch)
treeb44c493b8cbe5c515805c20a7849f638d21ab181
parentaed88cd40d44ade30f5fe6dc8b572f3ace71f74f (diff)
downloadgitlab-ce-0047429a97099a43aa0e54ae40c2a9b2d6e7f897.tar.gz
Cache project HEAD to prevent unnecessary Gitaly calls
-rw-r--r--lib/gitlab/cache/ci/project_pipeline_status.rb35
1 files changed, 9 insertions, 26 deletions
diff --git a/lib/gitlab/cache/ci/project_pipeline_status.rb b/lib/gitlab/cache/ci/project_pipeline_status.rb
index 78b0eaac8cd..195531ef94b 100644
--- a/lib/gitlab/cache/ci/project_pipeline_status.rb
+++ b/lib/gitlab/cache/ci/project_pipeline_status.rb
@@ -9,8 +9,6 @@ module Gitlab
class ProjectPipelineStatus
attr_accessor :sha, :status, :ref, :project, :loaded
- delegate :commit, to: :project
-
def self.load_for_project(project)
new(project).tap do |status|
status.load_status
@@ -18,33 +16,12 @@ module Gitlab
end
def self.load_in_batch_for_projects(projects)
- cached_results_for_projects(projects).zip(projects).each do |result, project|
- project.pipeline_status = new(project, result)
+ projects.each do |project|
+ project.pipeline_status = new(project)
project.pipeline_status.load_status
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)
pipeline_info = {
sha: pipeline.sha,
@@ -132,7 +109,13 @@ module Gitlab
end
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