From f580b340f8fa04a7f2e915e27857ff8dad39aa67 Mon Sep 17 00:00:00 2001
From: Michael Kuhn <michael.kuhn@informatik.uni-hamburg.de>
Date: Wed, 26 Feb 2020 07:45:33 +0100
Subject: [PATCH] Add new timeout fetch_option

This allows packages to override the global connect_timeout.
---
 lib/spack/spack/fetch_strategy.py                | 16 ++++++++++------
 .../repos/builtin/packages/bzip2/package.py      |  9 ++++++---
 .../repos/builtin/packages/libffi/package.py     |  6 +++++-
 3 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/lib/spack/spack/fetch_strategy.py b/lib/spack/spack/fetch_strategy.py
index 40d8b00728..4ca6a886d4 100644
--- a/lib/spack/spack/fetch_strategy.py
+++ b/lib/spack/spack/fetch_strategy.py
@@ -329,12 +329,6 @@ def _fetch_from_url(self, url):
             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')
 
@@ -343,6 +337,8 @@ def _fetch_from_url(self, url):
         else:
             curl_args.append('-sS')  # just errors when not.
 
+        connect_timeout = spack.config.get('config:connect_timeout')
+
         if self.extra_options:
             cookie = self.extra_options.get('cookie')
             if cookie:
@@ -350,6 +346,14 @@ def _fetch_from_url(self, url):
                 curl_args.append('-b')  # specify cookie
                 curl_args.append(cookie)
 
+            timeout = self.extra_options.get('timeout')
+            if timeout:
+                connect_timeout = max(connect_timeout, int(timeout))
+
+        if connect_timeout > 0:
+            # Timeout if can't establish a connection after n sec.
+            curl_args.extend(['--connect-timeout', str(connect_timeout)])
+
         # Run curl but grab the mime type from the http headers
         curl = self.curl
         with working_dir(self.stage.path):
diff --git a/var/spack/repos/builtin/packages/bzip2/package.py b/var/spack/repos/builtin/packages/bzip2/package.py
index 57d7046f93..87e616d76c 100644
--- a/var/spack/repos/builtin/packages/bzip2/package.py
+++ b/var/spack/repos/builtin/packages/bzip2/package.py
@@ -16,9 +16,12 @@ class Bzip2(Package):
     homepage = "https://sourceware.org/bzip2/"
     url      = "https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz"
 
-    version('1.0.8', sha256='ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269')
-    version('1.0.7', sha256='e768a87c5b1a79511499beb41500bcc4caf203726fff46a6f5f9ad27fe08ab2b')
-    version('1.0.6', sha256='a2848f34fcd5d6cf47def00461fcb528a0484d8edef8208d6d2e2909dc61d9cd')
+    # The server is sometimes a bit slow to respond
+    fetch_options = {'timeout': 60}
+
+    version('1.0.8', sha256='ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269', fetch_options=fetch_options)
+    version('1.0.7', sha256='e768a87c5b1a79511499beb41500bcc4caf203726fff46a6f5f9ad27fe08ab2b', fetch_options=fetch_options)
+    version('1.0.6', sha256='a2848f34fcd5d6cf47def00461fcb528a0484d8edef8208d6d2e2909dc61d9cd', fetch_options=fetch_options)
 
     variant('shared', default=True, description='Enables the build of shared libraries.')
 
diff --git a/var/spack/repos/builtin/packages/libffi/package.py b/var/spack/repos/builtin/packages/libffi/package.py
index e5bf7b1df6..028c591355 100644
--- a/var/spack/repos/builtin/packages/libffi/package.py
+++ b/var/spack/repos/builtin/packages/libffi/package.py
@@ -13,8 +13,12 @@ class Libffi(AutotoolsPackage):
     run time."""
     homepage = "https://sourceware.org/libffi/"
 
+    # The server is sometimes a bit slow to respond
+    fetch_options = {'timeout': 60}
+
     version('3.2.1', sha256='d06ebb8e1d9a22d19e38d63fdb83954253f39bedc5d46232a05645685722ca37',
-            url="https://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz")
+            url="https://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz",
+            fetch_options=fetch_options)
 
     @property
     def headers(self):
-- 
GitLab