Use exponential backoff when retrying HTTP connections

This commit is contained in:
Sybren A. Stüvel 2019-03-06 16:21:30 +01:00
parent 44ee553c0a
commit e9fcdb0191
2 changed files with 14 additions and 5 deletions

View File

@ -27,7 +27,9 @@ import requests
import blender_asset_tracer.pack as bat_pack import blender_asset_tracer.pack as bat_pack
import blender_asset_tracer.pack.transfer as bat_transfer import blender_asset_tracer.pack.transfer as bat_transfer
from blender_asset_tracer.pack.shaman.transfer import ShamanTransferrer
from .transfer import ShamanTransferrer
from .client import ShamanClient
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -55,8 +57,8 @@ class ShamanPacker(bat_pack.Packer):
def _get_auth_token(self) -> str: def _get_auth_token(self) -> str:
# TODO: get a token from the Flamenco Server. # TODO: get a token from the Flamenco Server.
log.warning('Using temporary hack to get auth token from Shaman') log.warning('Using temporary hack to get auth token from Shaman')
resp = requests.get(urllib.parse.urljoin(self.shaman_endpoint, 'get-token'), unauth_shaman = ShamanClient('', self.shaman_endpoint)
timeout=10) resp = unauth_shaman.get('get-token', timeout=10)
resp.raise_for_status() resp.raise_for_status()
return resp.text return resp.text

View File

@ -20,6 +20,7 @@
import urllib.parse import urllib.parse
import urllib3.util.retry
import requests.adapters import requests.adapters
@ -30,11 +31,17 @@ class ShamanClient:
self._auth_token = auth_token self._auth_token = auth_token
self._base_url = base_url self._base_url = base_url
http_adapter = requests.adapters.HTTPAdapter(max_retries=5) retries = urllib3.util.retry.Retry(
total=10,
backoff_factor=0.05,
)
http_adapter = requests.adapters.HTTPAdapter(max_retries=retries)
self._session = requests.session() self._session = requests.session()
self._session.mount('https://', http_adapter) self._session.mount('https://', http_adapter)
self._session.mount('http://', http_adapter) self._session.mount('http://', http_adapter)
self._session.headers['Authorization'] = 'Bearer ' + auth_token
if auth_token:
self._session.headers['Authorization'] = 'Bearer ' + auth_token
def request(self, method: str, url: str, **kwargs) -> requests.Response: def request(self, method: str, url: str, **kwargs) -> requests.Response:
kwargs.setdefault('timeout', 300) kwargs.setdefault('timeout', 300)