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.
This commit is contained in:
Sean McGivern 2017-07-07 12:56:09 +01:00
parent d40445e4c9
commit 4c0864fd9e
3 changed files with 9 additions and 2 deletions

View File

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

View File

@ -0,0 +1,4 @@
---
title: Make loading new merge requests (those created after the 9.4 upgrade) faster
merge_request:
author:

View File

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