Cache project HEAD to prevent unnecessary Gitaly calls

This commit is contained in:
Heinrich Lee Yu 2018-11-23 00:21:31 +08:00
parent aed88cd40d
commit 0047429a97
No known key found for this signature in database
GPG Key ID: 6EDB5D452716DE6B
1 changed files with 9 additions and 26 deletions

View File

@ -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