summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-01-20 21:08:46 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-01-20 21:08:46 +0000
commitee7fba4b844935437233f6c5b74545a28bac4298 (patch)
tree4f954fb6c51abd3f67edfa22f9eb987cac09eb7f
parente0ab7eda1b1013e3246b0db28689b0749158f0bf (diff)
downloadgitlab-ce-ee7fba4b844935437233f6c5b74545a28bac4298.tar.gz
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--app/helpers/submodule_helper.rb4
-rw-r--r--app/models/repository.rb4
-rw-r--r--changelogs/unreleased/sh-reduce-gitaly-calls-submodules.yml5
-rw-r--r--spec/helpers/submodule_helper_spec.rb12
-rw-r--r--spec/models/repository_spec.rb6
5 files changed, 25 insertions, 6 deletions
diff --git a/app/helpers/submodule_helper.rb b/app/helpers/submodule_helper.rb
index 4b83988e8bb..9707a5cef3b 100644
--- a/app/helpers/submodule_helper.rb
+++ b/app/helpers/submodule_helper.rb
@@ -7,9 +7,7 @@ module SubmoduleHelper
# links to files listing for submodule if submodule is a project on this server
def submodule_links(submodule_item, ref = nil, repository = @repository)
- url = repository.submodule_url_for(ref, submodule_item.path)
-
- submodule_links_for_url(submodule_item.id, url, repository)
+ repository.submodule_links.for(submodule_item, ref)
end
def submodule_links_for_url(submodule_item_id, url, repository)
diff --git a/app/models/repository.rb b/app/models/repository.rb
index a509315d94f..ebb653cabce 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -1094,6 +1094,10 @@ class Repository
message: message)
end
+ def submodule_links
+ @submodule_links ||= ::Gitlab::SubmoduleLinks.new(self)
+ end
+
def update_submodule(user, submodule, commit_sha, message:, branch:)
with_cache_hooks do
raw.update_submodule(
diff --git a/changelogs/unreleased/sh-reduce-gitaly-calls-submodules.yml b/changelogs/unreleased/sh-reduce-gitaly-calls-submodules.yml
new file mode 100644
index 00000000000..d7ad16f6a02
--- /dev/null
+++ b/changelogs/unreleased/sh-reduce-gitaly-calls-submodules.yml
@@ -0,0 +1,5 @@
+---
+title: Eliminate Gitaly N+1 queries loading submodules
+merge_request: 23292
+author:
+type: performance
diff --git a/spec/helpers/submodule_helper_spec.rb b/spec/helpers/submodule_helper_spec.rb
index fcfce0eaf31..8eb40b5975a 100644
--- a/spec/helpers/submodule_helper_spec.rb
+++ b/spec/helpers/submodule_helper_spec.rb
@@ -8,6 +8,11 @@ describe SubmoduleHelper do
let(:submodule_item) { double(id: 'hash', path: 'rack') }
let(:config) { Gitlab.config.gitlab }
let(:repo) { double }
+ let(:submodules) { Gitlab::SubmoduleLinks.new(repo) }
+
+ before do
+ allow(repo).to receive(:submodule_links).and_return(submodules)
+ end
shared_examples 'submodule_links' do
context 'submodule on self' do
@@ -163,7 +168,7 @@ describe SubmoduleHelper do
let(:repo) { double(:repo, project: project) }
def expect_relative_link_to_resolve_to(relative_path, expected_path)
- allow(repo).to receive(:submodule_url_for).and_return(relative_path)
+ stub_url(relative_path)
result = subject
expect(result).to eq([expected_path, "#{expected_path}/tree/#{submodule_item.id}"])
@@ -183,7 +188,7 @@ describe SubmoduleHelper do
context 'repo path resolves to be located at root (namespace absent)' do
it 'returns nil' do
- allow(repo).to receive(:submodule_url_for).and_return('../../test.git')
+ stub_url('../../test.git')
result = subject
@@ -193,7 +198,7 @@ describe SubmoduleHelper do
context 'repo path resolves to be located underneath current project path' do
it 'returns nil because it is not possible to have repo nested under another repo' do
- allow(repo).to receive(:submodule_url_for).and_return('./test.git')
+ stub_url('./test.git')
result = subject
@@ -263,6 +268,7 @@ describe SubmoduleHelper do
end
def stub_url(url)
+ allow(submodules).to receive(:submodule_url_for).and_return(url)
allow(repo).to receive(:submodule_url_for).and_return(url)
end
end
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index 38f3777c902..d08ca3983af 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -2714,4 +2714,10 @@ describe Repository do
.to change { Gitlab::GitalyClient.get_request_count }.by(1)
end
end
+
+ describe '#submodule_links' do
+ it 'returns an instance of Gitlab::SubmoduleLinks' do
+ expect(repository.submodule_links).to be_a(Gitlab::SubmoduleLinks)
+ end
+ end
end