From eee2c36ff88b3a2dde290b35cb40ae6d97220c70 Mon Sep 17 00:00:00 2001 From: Manuel Kaufmann Date: Wed, 14 Nov 2018 14:16:11 +0100 Subject: [PATCH 1/2] Retry mechanism for builders to keep trying when webs are overloaded --- readthedocs/restapi/client.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/readthedocs/restapi/client.py b/readthedocs/restapi/client.py index 0db823312c1..09761350db5 100644 --- a/readthedocs/restapi/client.py +++ b/readthedocs/restapi/client.py @@ -13,6 +13,7 @@ import requests from django.conf import settings +from requests.packages.urllib3.util.retry import Retry from requests_toolbelt.adapters import host_header_ssl from rest_framework.renderers import JSONRenderer from slumber import API, serialize @@ -44,9 +45,21 @@ def setup_api(): else: adapter_class = requests.adapters.HTTPAdapter + # Define a retry mechanism trying to attempt to not fail in the first + # error. Builders hit this issue frequently because the webs are high loaded + retry = Retry( + total=3, + read=3, + connect=3, + status=3, + backoff_factor=0.5, # 0.5, 1, 2 seconds + method_whitelist=('GET', 'PUT', 'PATCH', 'POST'), + status_forcelist=(408, 413, 429, 500, 502, 503, 504), + ) + session.mount( API_HOST, - adapter_class(max_retries=3), + adapter_class(max_retries=retry), ) session.headers.update({'Host': PRODUCTION_DOMAIN}) api_config = { From 3d8ac2e99afe702d3e407b89d75967911b8d64d8 Mon Sep 17 00:00:00 2001 From: Manuel Kaufmann Date: Mon, 19 Nov 2018 11:08:18 +0100 Subject: [PATCH 2/2] NOQA on import that lint doesn't find --- readthedocs/restapi/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readthedocs/restapi/client.py b/readthedocs/restapi/client.py index 09761350db5..83f5b861d83 100644 --- a/readthedocs/restapi/client.py +++ b/readthedocs/restapi/client.py @@ -13,7 +13,7 @@ import requests from django.conf import settings -from requests.packages.urllib3.util.retry import Retry +from requests.packages.urllib3.util.retry import Retry # noqa from requests_toolbelt.adapters import host_header_ssl from rest_framework.renderers import JSONRenderer from slumber import API, serialize