Use File.exist? to check if a repository exists
Initializing Rugged objects is way too expensive just to check if a repository exists. Even though we cache this data once in a while we have to refresh this. On GitLab.com we have seen Repository#exists? taking up to _1 minute_ to complete in the absolute worst case, though usually it sits around a second or so. Using File.exist? to instead check if $GIT_DIR/refs exists is a much faster way of checking if a repository was initialized properly.
This commit is contained in:
parent
df5548e19e
commit
6f393877e5
2 changed files with 8 additions and 7 deletions
|
@ -41,11 +41,7 @@ class Repository
|
|||
return @exists unless @exists.nil?
|
||||
|
||||
@exists = cache.fetch(:exists?) do
|
||||
begin
|
||||
raw_repository && raw_repository.rugged ? true : false
|
||||
rescue Gitlab::Git::Repository::NoRepository
|
||||
false
|
||||
end
|
||||
refs_directory_exists?
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -1148,6 +1144,12 @@ class Repository
|
|||
|
||||
private
|
||||
|
||||
def refs_directory_exists?
|
||||
return false unless path_with_namespace
|
||||
|
||||
File.exist?(File.join(path_to_repo, 'refs'))
|
||||
end
|
||||
|
||||
def cache
|
||||
@cache ||= RepositoryCache.new(path_with_namespace, @project.id)
|
||||
end
|
||||
|
|
|
@ -811,8 +811,7 @@ describe Repository, models: true do
|
|||
end
|
||||
|
||||
it 'returns false when a repository does not exist' do
|
||||
expect(repository.raw_repository).to receive(:rugged).
|
||||
and_raise(Gitlab::Git::Repository::NoRepository)
|
||||
allow(repository).to receive(:refs_directory_exists?).and_return(false)
|
||||
|
||||
expect(repository.exists?).to eq(false)
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue