Commit 3bb68efb authored by Douwe Maan's avatar Douwe Maan

Merge branch 'zj-blob-batch' into 'master'

Reroute batch blobs to single blob RPC

See merge request gitlab-org/gitlab-ce!16082
parents 4dd0c55f 6b15784c
...@@ -50,12 +50,21 @@ module Gitlab ...@@ -50,12 +50,21 @@ module Gitlab
# to the caller to limit the number of blobs and blob_size_limit. # to the caller to limit the number of blobs and blob_size_limit.
# #
# Gitaly migration issue: https://gitlab.com/gitlab-org/gitaly/issues/798 # Gitaly migration issue: https://gitlab.com/gitlab-org/gitaly/issues/798
def batch(repository, blob_references, blob_size_limit: nil) def batch(repository, blob_references, blob_size_limit: MAX_DATA_DISPLAY_SIZE)
blob_size_limit ||= MAX_DATA_DISPLAY_SIZE Gitlab::GitalyClient.migrate(:list_blobs_by_sha_path) do |is_enabled|
if is_enabled
Gitlab::GitalyClient.allow_n_plus_1_calls do
blob_references.map do |sha, path|
find_by_gitaly(repository, sha, path, limit: blob_size_limit)
end
end
else
blob_references.map do |sha, path| blob_references.map do |sha, path|
find_by_rugged(repository, sha, path, limit: blob_size_limit) find_by_rugged(repository, sha, path, limit: blob_size_limit)
end end
end end
end
end
# Find LFS blobs given an array of sha ids # Find LFS blobs given an array of sha ids
# Returns array of Gitlab::Git::Blob # Returns array of Gitlab::Git::Blob
...@@ -122,13 +131,23 @@ module Gitlab ...@@ -122,13 +131,23 @@ module Gitlab
) )
end end
def find_by_gitaly(repository, sha, path) def find_by_gitaly(repository, sha, path, limit: MAX_DATA_DISPLAY_SIZE)
path = path.sub(/\A\/*/, '') path = path.sub(/\A\/*/, '')
path = '/' if path.empty? path = '/' if path.empty?
name = File.basename(path) name = File.basename(path)
entry = Gitlab::GitalyClient::CommitService.new(repository).tree_entry(sha, path, MAX_DATA_DISPLAY_SIZE)
# Gitaly will think that setting the limit to 0 means unlimited, while
# the client might only need the metadata and thus set the limit to 0.
# In this method we'll then set the limit to 1, but clear the byte of data
# that we got back so for the outside world it looks like the limit was
# actually 0.
req_limit = limit == 0 ? 1 : limit
entry = Gitlab::GitalyClient::CommitService.new(repository).tree_entry(sha, path, req_limit)
return unless entry return unless entry
entry.data = "" if limit == 0
case entry.type case entry.type
when :COMMIT when :COMMIT
new( new(
......
...@@ -202,16 +202,6 @@ describe Gitlab::Git::Blob, seed_helper: true do ...@@ -202,16 +202,6 @@ describe Gitlab::Git::Blob, seed_helper: true do
context 'limiting' do context 'limiting' do
subject { described_class.batch(repository, blob_references, blob_size_limit: blob_size_limit) } subject { described_class.batch(repository, blob_references, blob_size_limit: blob_size_limit) }
context 'default' do
let(:blob_size_limit) { nil }
it 'limits to MAX_DATA_DISPLAY_SIZE' do
stub_const('Gitlab::Git::Blob::MAX_DATA_DISPLAY_SIZE', 100)
expect(subject.first.data.size).to eq(100)
end
end
context 'positive' do context 'positive' do
let(:blob_size_limit) { 10 } let(:blob_size_limit) { 10 }
...@@ -221,7 +211,10 @@ describe Gitlab::Git::Blob, seed_helper: true do ...@@ -221,7 +211,10 @@ describe Gitlab::Git::Blob, seed_helper: true do
context 'zero' do context 'zero' do
let(:blob_size_limit) { 0 } let(:blob_size_limit) { 0 }
it { expect(subject.first.data).to eq('') } it 'only loads the metadata' do
expect(subject.first.size).not_to be(0)
expect(subject.first.data).to eq('')
end
end end
context 'negative' do context 'negative' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment