Add configurable timeout for git fetch and clone operations
GitLab uses the import_project method in GitLab Shell, This method uses a timeout for the operation, hardcoded to 800 seconds. With this MR the timeout is now configurable in the gitlab_shell settings.
This commit is contained in:
parent
5173baa004
commit
0f1273fa44
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: Add configurable timeout for git fetch and clone operations
|
||||
merge_request: 10697
|
||||
author:
|
|
@ -502,6 +502,9 @@ production: &base
|
|||
upload_pack: true
|
||||
receive_pack: true
|
||||
|
||||
# Git import/fetch timeout
|
||||
# git_timeout: 800
|
||||
|
||||
# If you use non-standard ssh port you need to specify it
|
||||
# ssh_port: 22
|
||||
|
||||
|
|
|
@ -386,6 +386,7 @@ Settings.gitlab_shell['ssh_port'] ||= 22
|
|||
Settings.gitlab_shell['ssh_user'] ||= Settings.gitlab.user
|
||||
Settings.gitlab_shell['owner_group'] ||= Settings.gitlab.user
|
||||
Settings.gitlab_shell['ssh_path_prefix'] ||= Settings.__send__(:build_gitlab_shell_ssh_path_prefix)
|
||||
Settings.gitlab_shell['git_timeout'] ||= 800
|
||||
|
||||
#
|
||||
# Repositories
|
||||
|
|
|
@ -83,7 +83,7 @@ module Gitlab
|
|||
# Timeout should be less than 900 ideally, to prevent the memory killer
|
||||
# to silently kill the process without knowing we are timing out here.
|
||||
output, status = Popen.popen([gitlab_shell_projects_path, 'import-project',
|
||||
storage, "#{name}.git", url, '800'])
|
||||
storage, "#{name}.git", url, "#{Gitlab.config.gitlab_shell.git_timeout}"])
|
||||
raise Error, output unless status.zero?
|
||||
true
|
||||
end
|
||||
|
@ -99,7 +99,7 @@ module Gitlab
|
|||
# fetch_remote("gitlab/gitlab-ci", "upstream")
|
||||
#
|
||||
def fetch_remote(storage, name, remote, forced: false, no_tags: false)
|
||||
args = [gitlab_shell_projects_path, 'fetch-remote', storage, "#{name}.git", remote, '800']
|
||||
args = [gitlab_shell_projects_path, 'fetch-remote', storage, "#{name}.git", remote, "#{Gitlab.config.gitlab_shell.git_timeout}"]
|
||||
args << '--force' if forced
|
||||
args << '--no-tags' if no_tags
|
||||
|
||||
|
|
|
@ -91,4 +91,45 @@ describe Gitlab::Shell, lib: true do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'projects commands' do
|
||||
let(:projects_path) { 'tmp/tests/shell-projects-test/bin/gitlab-projects' }
|
||||
|
||||
before do
|
||||
allow(Gitlab.config.gitlab_shell).to receive(:path).and_return('tmp/tests/shell-projects-test')
|
||||
allow(Gitlab.config.gitlab_shell).to receive(:git_timeout).and_return(800)
|
||||
end
|
||||
|
||||
describe '#fetch_remote' do
|
||||
it 'returns true when the command succeeds' do
|
||||
expect(Gitlab::Popen).to receive(:popen)
|
||||
.with([projects_path, 'fetch-remote', 'current/storage', 'project/path.git', 'new/storage', '800']).and_return([nil, 0])
|
||||
|
||||
expect(gitlab_shell.fetch_remote('current/storage', 'project/path', 'new/storage')).to be true
|
||||
end
|
||||
|
||||
it 'raises an exception when the command fails' do
|
||||
expect(Gitlab::Popen).to receive(:popen)
|
||||
.with([projects_path, 'fetch-remote', 'current/storage', 'project/path.git', 'new/storage', '800']).and_return(["error", 1])
|
||||
|
||||
expect { gitlab_shell.fetch_remote('current/storage', 'project/path', 'new/storage') }.to raise_error(Gitlab::Shell::Error, "error")
|
||||
end
|
||||
end
|
||||
|
||||
describe '#import_repository' do
|
||||
it 'returns true when the command succeeds' do
|
||||
expect(Gitlab::Popen).to receive(:popen)
|
||||
.with([projects_path, 'import-project', 'current/storage', 'project/path.git', 'https://gitlab.com/gitlab-org/gitlab-ce.git', "800"]).and_return([nil, 0])
|
||||
|
||||
expect(gitlab_shell.import_repository('current/storage', 'project/path', 'https://gitlab.com/gitlab-org/gitlab-ce.git')).to be true
|
||||
end
|
||||
|
||||
it 'raises an exception when the command fails' do
|
||||
expect(Gitlab::Popen).to receive(:popen)
|
||||
.with([projects_path, 'import-project', 'current/storage', 'project/path.git', 'https://gitlab.com/gitlab-org/gitlab-ce.git', "800"]).and_return(["error", 1])
|
||||
|
||||
expect { gitlab_shell.import_repository('current/storage', 'project/path', 'https://gitlab.com/gitlab-org/gitlab-ce.git') }.to raise_error(Gitlab::Shell::Error, "error")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue