From e69c9fe97b764a18c2cc1bf4d3287dbdfdc40fc8 Mon Sep 17 00:00:00 2001 From: Tobias Henkel Date: Wed, 30 Jan 2019 14:03:15 +0100 Subject: [PATCH] Make git clone timeout configurable When dealing with large repos or slow connections to the scm the default clone timeout of 5 minutes may not be sufficient. Thus a configurable clone/fetch timeout can make it possible to handle those repos. Change-Id: I0711895806b7cbcc8b9fa3ba085bcf79d7fb6665 --- doc/source/admin/components.rst | 10 ++++++++++ zuul/configloader.py | 2 +- zuul/executor/server.py | 3 ++- zuul/merger/client.py | 2 ++ zuul/merger/merger.py | 6 ++++-- zuul/merger/server.py | 3 ++- 6 files changed, 21 insertions(+), 5 deletions(-) diff --git a/doc/source/admin/components.rst b/doc/source/admin/components.rst index be6fd5226d..c0038a8f15 100644 --- a/doc/source/admin/components.rst +++ b/doc/source/admin/components.rst @@ -373,6 +373,16 @@ The following section of ``zuul.conf`` is used by the merger: Value in seconds, setting to 0 will disable. + .. attr:: git_timeout + :default: 300 + + Timeout for git clone and fetch operations. This can be useful when + dealing with large repos. Note that large timeouts can increase startup + and reconfiguration times if repos are not cached so be cautious when + increasing this value. + + Value in seconds. + .. attr:: git_user_email Value to pass to `git config user.email diff --git a/zuul/configloader.py b/zuul/configloader.py index 64318e2658..d067a4088c 100644 --- a/zuul/configloader.py +++ b/zuul/configloader.py @@ -1586,7 +1586,7 @@ class TenantParser(object): for job in jobs: self.log.debug("Waiting for cat job %s" % (job,)) - job.wait() + job.wait(self.merger.git_timeout) if not job.updated: raise Exception("Cat job %s failed" % (job,)) self.log.debug("Cat job %s got files %s" % diff --git a/zuul/executor/server.py b/zuul/executor/server.py index 688e6db1bd..263e6b201d 100644 --- a/zuul/executor/server.py +++ b/zuul/executor/server.py @@ -2152,6 +2152,7 @@ class ExecutorServer(object): config, 'merger', 'git_http_low_speed_limit', '1000') self.merge_speed_time = get_default( config, 'merger', 'git_http_low_speed_time', '30') + self.git_timeout = get_default(config, 'merger', 'git_timeout', 300) # If the execution driver ever becomes configurable again, # this is where it would happen. execution_wrapper_name = 'bubblewrap' @@ -2228,7 +2229,7 @@ class ExecutorServer(object): return zuul.merger.merger.Merger( root, self.connections, self.merge_email, self.merge_name, self.merge_speed_limit, self.merge_speed_time, cache_root, logger, - execution_context=True) + execution_context=True, git_timeout=self.git_timeout) def start(self): self._running = True diff --git a/zuul/merger/client.py b/zuul/merger/client.py index d53448914a..b5b05903c3 100644 --- a/zuul/merger/client.py +++ b/zuul/merger/client.py @@ -85,6 +85,8 @@ class MergeClient(object): self.gearman.addServer(server, port, ssl_key, ssl_cert, ssl_ca, keepalive=True, tcp_keepidle=60, tcp_keepintvl=30, tcp_keepcnt=5) + self.git_timeout = get_default( + self.config, 'merger', 'git_timeout', 300) self.log.debug("Waiting for gearman") self.gearman.waitForServer() self.jobs = set() diff --git a/zuul/merger/merger.py b/zuul/merger/merger.py index 0c14fbfb37..c6eccaf195 100644 --- a/zuul/merger/merger.py +++ b/zuul/merger/merger.py @@ -496,7 +496,7 @@ class Repo(object): class Merger(object): def __init__(self, working_root, connections, email, username, speed_limit, speed_time, cache_root=None, logger=None, - execution_context=False): + execution_context=False, git_timeout=300): self.logger = logger if logger is None: self.log = logging.getLogger("zuul.Merger") @@ -510,6 +510,7 @@ class Merger(object): self.username = username self.speed_limit = speed_limit self.speed_time = speed_time + self.git_timeout = git_timeout self.cache_root = cache_root # Flag to determine if the merger is used for preparing repositories # for job execution. This flag can be used to enable executor specific @@ -528,7 +529,8 @@ class Merger(object): cache_path = None repo = Repo( url, path, self.email, self.username, self.speed_limit, - self.speed_time, sshkey, cache_path, self.logger) + self.speed_time, sshkey=sshkey, cache_path=cache_path, + logger=self.logger, git_timeout=self.git_timeout) self.repos[key] = repo except Exception: diff --git a/zuul/merger/server.py b/zuul/merger/server.py index bdb3cc5d88..fc8942d94b 100644 --- a/zuul/merger/server.py +++ b/zuul/merger/server.py @@ -41,9 +41,10 @@ class MergeServer(object): config, 'merger', 'git_http_low_speed_limit', '1000') speed_time = get_default( config, 'merger', 'git_http_low_speed_time', '30') + git_timeout = get_default(config, 'merger', 'git_timeout', 300) self.merger = merger.Merger( merge_root, connections, merge_email, merge_name, speed_limit, - speed_time) + speed_time, git_timeout=git_timeout) self.command_map = dict( stop=self.stop) command_socket = get_default(