Cache project HEAD to prevent unnecessary Gitaly calls
This commit is contained in:
parent
aed88cd40d
commit
0047429a97
|
|
@ -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
|
||||||
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
|
||||||
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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue