Avoid Gitaly RPC errors when fetching diff stats

This commit is contained in:
Oswaldo Ferreira 2018-11-12 17:26:51 -02:00
parent 0ff34e7729
commit 039df0267e
3 changed files with 28 additions and 1 deletions

View file

@ -0,0 +1,5 @@
---
title: Avoid Gitaly RPC errors when fetching diff stats
merge_request: 22995
author:
type: fixed

View file

@ -419,13 +419,17 @@ module Gitlab
end end
def diff_stats(left_id, right_id) def diff_stats(left_id, right_id)
if [left_id, right_id].any? { |ref| ref.blank? || Gitlab::Git.blank_ref?(ref) }
return empty_diff_stats
end
stats = wrapped_gitaly_errors do stats = wrapped_gitaly_errors do
gitaly_commit_client.diff_stats(left_id, right_id) gitaly_commit_client.diff_stats(left_id, right_id)
end end
Gitlab::Git::DiffStatsCollection.new(stats) Gitlab::Git::DiffStatsCollection.new(stats)
rescue CommandError, TypeError rescue CommandError, TypeError
Gitlab::Git::DiffStatsCollection.new([]) empty_diff_stats
end end
# Returns a RefName for a given SHA # Returns a RefName for a given SHA
@ -962,6 +966,10 @@ module Gitlab
private private
def empty_diff_stats
Gitlab::Git::DiffStatsCollection.new([])
end
def uncached_has_local_branches? def uncached_has_local_branches?
wrapped_gitaly_errors do wrapped_gitaly_errors do
gitaly_repository_client.has_local_branches? gitaly_repository_client.has_local_branches?

View file

@ -1095,12 +1095,26 @@ describe Gitlab::Git::Repository, :seed_helper do
end end
it 'returns no Gitaly::DiffStats when there is a nil SHA' do it 'returns no Gitaly::DiffStats when there is a nil SHA' do
expect_any_instance_of(Gitlab::GitalyClient::CommitService)
.not_to receive(:diff_stats)
collection = repository.diff_stats(nil, 'master') collection = repository.diff_stats(nil, 'master')
expect(collection).to be_a(Gitlab::Git::DiffStatsCollection) expect(collection).to be_a(Gitlab::Git::DiffStatsCollection)
expect(collection).to be_a(Enumerable) expect(collection).to be_a(Enumerable)
expect(collection.to_a).to be_empty expect(collection.to_a).to be_empty
end end
it 'returns no Gitaly::DiffStats when there is a BLANK_SHA' do
expect_any_instance_of(Gitlab::GitalyClient::CommitService)
.not_to receive(:diff_stats)
collection = repository.diff_stats(Gitlab::Git::BLANK_SHA, 'master')
expect(collection).to be_a(Gitlab::Git::DiffStatsCollection)
expect(collection).to be_a(Enumerable)
expect(collection.to_a).to be_empty
end
end end
describe "#ls_files" do describe "#ls_files" do