[PATCH] D38281: [llvmlab] Add timeout and retries for fetching builds.

Volodymyr Sapsai via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 26 15:31:19 PDT 2017


vsapsai created this revision.

In case of network problems, time out after 5 seconds instead of relying on OS
to close the connection which can take more than 20 minutes. Timeout value is
measured between successfully transmitted packets, not for entire transaction.
So we don't require big files to be downloaded in 5 seconds but we require not
to get stuck for more than 5 seconds.


https://reviews.llvm.org/D38281

Files:
  llvmbisect/llvmlab/gcs.py


Index: llvmbisect/llvmlab/gcs.py
===================================================================
--- llvmbisect/llvmlab/gcs.py
+++ llvmbisect/llvmlab/gcs.py
@@ -3,22 +3,36 @@
 """
 import os
 import requests
+import urllib3
 
 # Root URL to use for our queries.
 GCS = "https://www.googleapis.com/storage/v1/"
 
 DEFAULT_BUCKET = "llvm-build-artifacts"
 
 BUCKET = os.getenv("BUCKET", DEFAULT_BUCKET)
 
+class HttpClient(object):
+    def __init__(self):
+        self.session = requests.Session()
+        # Retry after 0s, 0.2s, 0.4s.
+        retry = urllib3.util.retry.Retry(total=3, backoff_factor=0.1)
+        adapter = requests.adapters.HTTPAdapter(max_retries=retry)
+        self.session.mount('https://', adapter)
+
+    def get(self, url, **kwargs):
+        if "timeout" not in kwargs:
+            kwargs["timeout"] = 5  # seconds
+        return self.session.get(url, **kwargs)
+
 
 def fetch_builders():
     """Each build kind is stored as a folder in the GCS bucket.
     List all the folders in the bucket, which is our list of possible
     compilers.
     """
     params = {'delimiter': "/", 'fields': "prefixes,nextPageToken"}
-    r = requests.get(GCS + "b/" + BUCKET + "/o", params=params)
+    r = HttpClient().get(GCS + "b/" + BUCKET + "/o", params=params)
     r.raise_for_status()
     reply_data = r.json()
     assert "nextPageToken" not in reply_data.keys(), "Too many builders!"
@@ -36,13 +50,14 @@
     params = {'delimiter': "/",
              "fields": "nextPageToken,kind,items(name, mediaLink)",
              'prefix': project + "/"}
-    r = requests.get(GCS + "b/" + BUCKET + "/o", params=params)
+    http = HttpClient()
+    r = http.get(GCS + "b/" + BUCKET + "/o", params=params)
     r.raise_for_status()
     reply_data = r.json()
     all_data['items'].extend(reply_data['items'])
     while reply_data.get('nextPageToken'):
         params['pageToken'] = reply_data['nextPageToken']
-        r = requests.get(GCS + "b/" + BUCKET + "/o", params=params)
+        r = http.get(GCS + "b/" + BUCKET + "/o", params=params)
         r.raise_for_status()
         reply_data = r.json()
         all_data['items'].extend(reply_data['items'])
@@ -54,7 +69,7 @@
 
 def get_compiler(url, filename):
     """Get the compiler at the url, and save to filename."""
-    r = requests.get(url)
+    r = HttpClient().get(url)
     r.raise_for_status()
     with open(filename, 'wb') as fd:
         for chunk in r.iter_content(CHUNK_SIZE):


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D38281.116681.patch
Type: text/x-patch
Size: 2473 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170926/20aad690/attachment-0001.bin>


More information about the llvm-commits mailing list