Create git_http_low_speed_limit / git_http_low_speed_time

Expose 2 new settings to zuul.conf allowing an operator better
control over them.  By default we set the speed limit to 1000 bytes
and speed time to 30 seconds.

Change-Id: I9da80fcfc312cbc12ea11ee7284eaec23adb97c9
Signed-off-by: Paul Belanger <pabelanger@redhat.com>
This commit is contained in:
Paul Belanger 2017-10-05 16:04:27 -04:00
parent 06ab26d80c
commit edadfed256
5 changed files with 42 additions and 16 deletions

View File

@ -265,6 +265,22 @@ The following section of ``zuul.conf`` is used by the merger:
Directory in which Zuul should clone git repositories. Directory in which Zuul should clone git repositories.
.. attr:: git_http_low_speed_limit
:default: 1000
If the HTTP transfer speed is less then git_http_low_speed_limit for
longer then git_http_low_speed_time, the transfer is aborted.
Value in bytes, setting to 0 will disable.
.. attr:: git_http_low_speed_time
:default: 30
If the HTTP transfer speed is less then git_http_low_speed_limit for
longer then git_http_low_speed_time, the transfer is aborted.
Value in seconds, setting to 0 will disable.
.. attr:: git_user_email .. attr:: git_user_email
Value to pass to `git config user.email Value to pass to `git config user.email

View File

@ -49,7 +49,7 @@ class TestMergerRepo(ZuulTestCase):
msg='.git file in submodule should be a file') msg='.git file in submodule should be a file')
work_repo = Repo(parent_path, self.workspace_root, work_repo = Repo(parent_path, self.workspace_root,
'none@example.org', 'User Name') 'none@example.org', 'User Name', '0', '0')
self.assertTrue( self.assertTrue(
os.path.isdir(os.path.join(self.workspace_root, 'subdir')), os.path.isdir(os.path.join(self.workspace_root, 'subdir')),
msg='Cloned repository has a submodule placeholder directory') msg='Cloned repository has a submodule placeholder directory')
@ -60,7 +60,7 @@ class TestMergerRepo(ZuulTestCase):
sub_repo = Repo( sub_repo = Repo(
os.path.join(self.upstream_root, 'org/project2'), os.path.join(self.upstream_root, 'org/project2'),
os.path.join(self.workspace_root, 'subdir'), os.path.join(self.workspace_root, 'subdir'),
'none@example.org', 'User Name') 'none@example.org', 'User Name', '0', '0')
self.assertTrue(os.path.exists( self.assertTrue(os.path.exists(
os.path.join(self.workspace_root, 'subdir', '.git')), os.path.join(self.workspace_root, 'subdir', '.git')),
msg='Cloned over the submodule placeholder') msg='Cloned over the submodule placeholder')

View File

@ -562,6 +562,10 @@ class ExecutorServer(object):
'disk_limit_per_job', 250)) 'disk_limit_per_job', 250))
self.merge_email = get_default(self.config, 'merger', 'git_user_email') self.merge_email = get_default(self.config, 'merger', 'git_user_email')
self.merge_name = get_default(self.config, 'merger', 'git_user_name') self.merge_name = get_default(self.config, 'merger', 'git_user_name')
self.merge_speed_limit = get_default(
config, 'merger', 'git_http_low_speed_limit', '1000')
self.merge_speed_time = get_default(
config, 'merger', 'git_http_low_speed_time', '30')
execution_wrapper_name = get_default(self.config, 'executor', execution_wrapper_name = get_default(self.config, 'executor',
'execution_wrapper', 'bubblewrap') 'execution_wrapper', 'bubblewrap')
load_multiplier = float(get_default(self.config, 'executor', load_multiplier = float(get_default(self.config, 'executor',
@ -618,9 +622,9 @@ class ExecutorServer(object):
cache_root = self.merge_root cache_root = self.merge_root
else: else:
cache_root = None cache_root = None
return zuul.merger.merger.Merger(root, self.connections, return zuul.merger.merger.Merger(
self.merge_email, self.merge_name, root, self.connections, self.merge_email, self.merge_name,
cache_root, logger) self.merge_speed_limit, self.merge_speed_time, cache_root, logger)
def start(self): def start(self):
self._running = True self._running = True

View File

@ -44,16 +44,15 @@ class ZuulReference(git.Reference):
class Repo(object): class Repo(object):
def __init__(self, remote, local, email, username, sshkey=None, def __init__(self, remote, local, email, username, speed_limit, speed_time,
cache_path=None, logger=None): sshkey=None, cache_path=None, logger=None):
if logger is None: if logger is None:
self.log = logging.getLogger("zuul.Repo") self.log = logging.getLogger("zuul.Repo")
else: else:
self.log = logger self.log = logger
# TODO(pabelanger): Expose to user via zuul.conf.
self.env = { self.env = {
'GIT_HTTP_LOW_SPEED_LIMIT': '1000', 'GIT_HTTP_LOW_SPEED_LIMIT': speed_limit,
'GIT_HTTP_LOW_SPEED_TIME': '30', 'GIT_HTTP_LOW_SPEED_TIME': speed_time,
} }
if sshkey: if sshkey:
self.env['GIT_SSH_COMMAND'] = 'ssh -i %s' % (sshkey,) self.env['GIT_SSH_COMMAND'] = 'ssh -i %s' % (sshkey,)
@ -297,7 +296,7 @@ class Repo(object):
class Merger(object): class Merger(object):
def __init__(self, working_root, connections, email, username, def __init__(self, working_root, connections, email, username,
cache_root=None, logger=None): speed_limit, speed_time, cache_root=None, logger=None):
self.logger = logger self.logger = logger
if logger is None: if logger is None:
self.log = logging.getLogger("zuul.Merger") self.log = logging.getLogger("zuul.Merger")
@ -310,6 +309,8 @@ class Merger(object):
self.connections = connections self.connections = connections
self.email = email self.email = email
self.username = username self.username = username
self.speed_limit = speed_limit
self.speed_time = speed_time
self.cache_root = cache_root self.cache_root = cache_root
def _addProject(self, hostname, project_name, url, sshkey): def _addProject(self, hostname, project_name, url, sshkey):
@ -322,8 +323,9 @@ class Merger(object):
project_name) project_name)
else: else:
cache_path = None cache_path = None
repo = Repo(url, path, self.email, self.username, repo = Repo(
sshkey, cache_path, self.logger) url, path, self.email, self.username, self.speed_limit,
self.speed_time, sshkey, cache_path, self.logger)
self.repos[key] = repo self.repos[key] = repo
except Exception: except Exception:

View File

@ -33,9 +33,13 @@ class MergeServer(object):
'/var/lib/zuul/merger-git') '/var/lib/zuul/merger-git')
merge_email = get_default(self.config, 'merger', 'git_user_email') merge_email = get_default(self.config, 'merger', 'git_user_email')
merge_name = get_default(self.config, 'merger', 'git_user_name') merge_name = get_default(self.config, 'merger', 'git_user_name')
speed_limit = get_default(
self.merger = merger.Merger(merge_root, connections, merge_email, config, 'merger', 'git_http_low_speed_limit', '1000')
merge_name) speed_time = get_default(
config, 'merger', 'git_http_low_speed_time', '30')
self.merger = merger.Merger(
merge_root, connections, merge_email, merge_name, speed_limit,
speed_time)
def start(self): def start(self):
self._running = True self._running = True