From 7325c207941f1dbd9d7cd83f9659eb25951ac1f9 Mon Sep 17 00:00:00 2001
From: Michael Kuhn <michael.kuhn@informatik.uni-hamburg.de>
Date: Tue, 25 Feb 2020 16:42:12 +0100
Subject: [PATCH] config: Add a new option connect_timeout

connect_timeout can be used to increase the time Spack waits for the
server to answer. This can be used to work around slow connections or
servers.

Fixes #14700
---
 etc/spack/defaults/config.yaml    | 6 ++++++
 lib/spack/spack/config.py         | 1 +
 lib/spack/spack/fetch_strategy.py | 8 ++++++--
 lib/spack/spack/schema/config.py  | 1 +
 4 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/etc/spack/defaults/config.yaml b/etc/spack/defaults/config.yaml
index 32745a309a..cc51060eae 100644
--- a/etc/spack/defaults/config.yaml
+++ b/etc/spack/defaults/config.yaml
@@ -75,6 +75,12 @@ config:
   misc_cache: ~/.spack/cache
 
 
+  # Timeout in seconds used for downloading sources etc. This only applies
+  # to the connection phase and can be increased for slow connections or
+  # servers. 0 means no timeout.
+  connect_timeout: 10
+
+
   # If this is false, tools like curl that use SSL will not verify
   # certifiates. (e.g., curl will use use the -k option)
   verify_ssl: true
diff --git a/lib/spack/spack/config.py b/lib/spack/spack/config.py
index b1c0ad73c7..7ed47340bf 100644
--- a/lib/spack/spack/config.py
+++ b/lib/spack/spack/config.py
@@ -97,6 +97,7 @@
 config_defaults = {
     'config': {
         'debug': False,
+        'connect_timeout': 10,
         'verify_ssl': True,
         'checksum': True,
         'dirty': False,
diff --git a/lib/spack/spack/fetch_strategy.py b/lib/spack/spack/fetch_strategy.py
index 5ae01286c4..38ed17d28e 100644
--- a/lib/spack/spack/fetch_strategy.py
+++ b/lib/spack/spack/fetch_strategy.py
@@ -326,11 +326,15 @@ def _fetch_from_url(self, url):
             '-D',
             '-',  # print out HTML headers
             '-L',  # resolve 3xx redirects
-            # Timeout if can't establish a connection after 10 sec.
-            '--connect-timeout', '10',
             url,
         ]
 
+        connect_timeout = spack.config.get('config:connect_timeout')
+
+        if connect_timeout > 0:
+            # Timeout if can't establish a connection after n sec.
+            curl_args.extend(['--connect-timeout', str(connect_timeout)])
+
         if not spack.config.get('config:verify_ssl'):
             curl_args.append('-k')
 
diff --git a/lib/spack/spack/schema/config.py b/lib/spack/spack/schema/config.py
index 1378698825..a05af2f438 100644
--- a/lib/spack/spack/schema/config.py
+++ b/lib/spack/spack/schema/config.py
@@ -55,6 +55,7 @@
             },
             'source_cache': {'type': 'string'},
             'misc_cache': {'type': 'string'},
+            'connect_timeout': {'type': 'integer', 'minimum': 0},
             'verify_ssl': {'type': 'boolean'},
             'suppress_gpg_warnings': {'type': 'boolean'},
             'install_missing_compilers': {'type': 'boolean'},
-- 
GitLab