Counting commits is done by Gitaly

Closes https://gitlab.com/gitlab-org/gitaly/issues/382
This commit is contained in:
Zeger-Jan van de Weg 2018-06-14 13:01:55 +02:00
parent 0716e19271
commit c24e39ab88
No known key found for this signature in database
GPG key ID: 65F6A8D64A88ABAC
3 changed files with 18 additions and 80 deletions

View file

@ -31,8 +31,11 @@ class Projects::BranchesController < Projects::ApplicationController
end end
end end
# https://gitlab.com/gitlab-org/gitlab-ce/issues/48097
Gitlab::GitalyClient.allow_n_plus_1_calls do
render render
end end
end
format.json do format.json do
branches = BranchesFinder.new(@repository, params).execute branches = BranchesFinder.new(@repository, params).execute
branches = Kaminari.paginate_array(branches).page(params[:page]) branches = Kaminari.paginate_array(branches).page(params[:page])

View file

@ -472,13 +472,21 @@ module Gitlab
end end
def count_commits(options) def count_commits(options)
count_commits_options = process_count_commits_options(options) options = process_count_commits_options(options.dup)
gitaly_migrate(:count_commits, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled| wrapped_gitaly_errors do
if is_enabled if options[:left_right]
count_commits_by_gitaly(count_commits_options) from = options[:from]
to = options[:to]
right_count = gitaly_commit_client
.commit_count("#{from}..#{to}", options)
left_count = gitaly_commit_client
.commit_count("#{to}..#{from}", options)
[left_count, right_count]
else else
count_commits_by_shelling_out(count_commits_options) gitaly_commit_client.commit_count(options[:ref], options)
end end
end end
end end
@ -1902,71 +1910,6 @@ module Gitlab
gitaly_repository_client.repository_size gitaly_repository_client.repository_size
end end
def count_commits_by_gitaly(options)
if options[:left_right]
from = options[:from]
to = options[:to]
right_count = gitaly_commit_client
.commit_count("#{from}..#{to}", options)
left_count = gitaly_commit_client
.commit_count("#{to}..#{from}", options)
[left_count, right_count]
else
gitaly_commit_client.commit_count(options[:ref], options)
end
end
def count_commits_by_shelling_out(options)
cmd = count_commits_shelling_command(options)
raw_output, _status = run_git(cmd)
process_count_commits_raw_output(raw_output, options)
end
def count_commits_shelling_command(options)
cmd = %w[rev-list]
cmd << "--after=#{options[:after].iso8601}" if options[:after]
cmd << "--before=#{options[:before].iso8601}" if options[:before]
cmd << "--max-count=#{options[:max_count]}" if options[:max_count]
cmd << "--left-right" if options[:left_right]
cmd << '--count'
cmd << if options[:all]
'--all'
elsif options[:ref]
options[:ref]
else
raise ArgumentError, "Please specify a valid ref or set the 'all' attribute to true"
end
cmd += %W[-- #{options[:path]}] if options[:path].present?
cmd
end
def process_count_commits_raw_output(raw_output, options)
if options[:left_right]
result = raw_output.scan(/\d+/).map(&:to_i)
if result.sum != options[:max_count]
result
else # Reaching max count, right is not accurate
right_option =
process_count_commits_options(options
.except(:left_right, :from, :to)
.merge(ref: options[:to]))
right = count_commits_by_shelling_out(right_option)
[result.first, right] # left should be accurate in the first call
end
else
raw_output.to_i
end
end
def gitaly_ls_files(ref) def gitaly_ls_files(ref)
gitaly_commit_client.ls_files(ref) gitaly_commit_client.ls_files(ref)
end end

View file

@ -1114,7 +1114,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
end end
describe '#count_commits' do describe '#count_commits' do
shared_examples 'extended commit counting' do describe 'extended commit counting' do
context 'with after timestamp' do context 'with after timestamp' do
it 'returns the number of commits after timestamp' do it 'returns the number of commits after timestamp' do
options = { ref: 'master', after: Time.iso8601('2013-03-03T20:15:01+00:00') } options = { ref: 'master', after: Time.iso8601('2013-03-03T20:15:01+00:00') }
@ -1199,14 +1199,6 @@ describe Gitlab::Git::Repository, seed_helper: true do
end end
end end
end end
context 'when Gitaly count_commits feature is enabled' do
it_behaves_like 'extended commit counting'
end
context 'when Gitaly count_commits feature is disabled', :disable_gitaly do
it_behaves_like 'extended commit counting'
end
end end
describe '#autocrlf' do describe '#autocrlf' do