Restore lazy loading of pipeline commits in preloader
This commit is contained in:
parent
c0827455ab
commit
1af2274b41
2 changed files with 27 additions and 6 deletions
|
@ -7,9 +7,16 @@ module Gitlab
|
|||
# authors.
|
||||
class Preloader
|
||||
def self.preload!(pipelines)
|
||||
##
|
||||
# This preloads all commits at once, because `Ci::Pipeline#commit` is
|
||||
# using a lazy batch loading, what results in only one batched Gitaly
|
||||
# call.
|
||||
#
|
||||
pipelines.each(&:commit)
|
||||
|
||||
pipelines.each do |pipeline|
|
||||
self.new(pipeline).tap do |preloader|
|
||||
preloader.preload_commits
|
||||
preloader.preload_commit_authors
|
||||
preloader.preload_pipeline_warnings
|
||||
preloader.preload_stages_warnings
|
||||
end
|
||||
|
@ -20,10 +27,7 @@ module Gitlab
|
|||
@pipeline = pipeline
|
||||
end
|
||||
|
||||
def preload_commits
|
||||
# This ensures that all the pipeline commits are eager loaded before we
|
||||
# start using them.
|
||||
#
|
||||
def preload_commit_authors
|
||||
# This also preloads the author of every commit. We're using "lazy_author"
|
||||
# here since "author" immediately loads the data on the first call.
|
||||
@pipeline.commit.try(:lazy_author)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'fast_spec_helper'
|
||||
require 'spec_helper'
|
||||
|
||||
describe Gitlab::Ci::Pipeline::Preloader do
|
||||
let(:stage) { double(:stage) }
|
||||
|
@ -11,6 +11,23 @@ describe Gitlab::Ci::Pipeline::Preloader do
|
|||
end
|
||||
|
||||
describe '.preload!' do
|
||||
context 'when preloading multiple commits' do
|
||||
let(:project) { create(:project, :repository) }
|
||||
|
||||
it 'preloads all commits once' do
|
||||
expect(Commit).to receive(:decorate).once.and_call_original
|
||||
|
||||
pipelines = [build_pipeline(ref: 'HEAD'),
|
||||
build_pipeline(ref: 'HEAD~1')]
|
||||
|
||||
described_class.preload!(pipelines)
|
||||
end
|
||||
|
||||
def build_pipeline(ref:)
|
||||
build_stubbed(:ci_pipeline, project: project, sha: project.commit(ref).id)
|
||||
end
|
||||
end
|
||||
|
||||
it 'preloads commit authors and number of warnings' do
|
||||
expect(commit).to receive(:lazy_author)
|
||||
expect(pipeline).to receive(:number_of_warnings)
|
||||
|
|
Loading…
Reference in a new issue