From 4c0864fd9e14cda78cacdfbbc2f3072b699ebb9b Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Fri, 7 Jul 2017 12:56:09 +0100 Subject: [PATCH] Speed up `all_commit_shas` for new merge requests For merge requests created after 9.4, we have a `merge_request_diff_commits` table we can get all the SHAs from very quickly. We just need to exclude these when we load from the legacy format, by ignoring diffs with no serialised commits. Once these have been migrated in the background, every MR will see this improvement. --- app/models/merge_request.rb | 5 ++++- .../unreleased/speed-up-merge-request-all-commits-shas.yml | 4 ++++ spec/models/merge_request_spec.rb | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 changelogs/unreleased/speed-up-merge-request-all-commits-shas.yml diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 2fc6191e785..6ea774470af 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -849,7 +849,10 @@ class MergeRequest < ActiveRecord::Base # def all_commit_shas if persisted? - merge_request_diffs.preload(:merge_request_diff_commits).flat_map(&:commit_shas).uniq + column_shas = MergeRequestDiffCommit.where(merge_request_diff: merge_request_diffs).pluck('DISTINCT(sha)') + serialised_shas = merge_request_diffs.where.not(st_commits: nil).flat_map(&:commit_shas) + + (column_shas + serialised_shas).uniq elsif compare_commits compare_commits.to_a.reverse.map(&:id) else diff --git a/changelogs/unreleased/speed-up-merge-request-all-commits-shas.yml b/changelogs/unreleased/speed-up-merge-request-all-commits-shas.yml new file mode 100644 index 00000000000..00f55edc2b7 --- /dev/null +++ b/changelogs/unreleased/speed-up-merge-request-all-commits-shas.yml @@ -0,0 +1,4 @@ +--- +title: Make loading new merge requests (those created after the 9.4 upgrade) faster +merge_request: +author: diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index ea405fabff0..1eadc28869f 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -803,7 +803,7 @@ describe MergeRequest, models: true do shared_examples 'returning all SHA' do it 'returns all SHA from all merge_request_diffs' do expect(subject.merge_request_diffs.size).to eq(2) - expect(subject.all_commit_shas).to eq(all_commit_shas) + expect(subject.all_commit_shas).to match_array(all_commit_shas) end end -- GitLab