diff --git a/libmozevent/phabricator.py b/libmozevent/phabricator.py index a011e4b..daf2b2c 100644 --- a/libmozevent/phabricator.py +++ b/libmozevent/phabricator.py @@ -6,6 +6,8 @@ import structlog from libmozdata.phabricator import PhabricatorAPI +from libmozevent.utils import get_session + logger = structlog.get_logger(__name__) @@ -21,10 +23,16 @@ class PhabricatorBuild(object): """ def __init__(self, request): - self.diff_id = int(request.rel_url.query.get("diff", 0)) - self.repo_phid = request.rel_url.query.get("repo") - self.revision_id = int(request.rel_url.query.get("revision", 0)) - self.target_phid = request.rel_url.query.get("target") + self.diff_id = int( + get_session("phabricator", request).rel_url.query.get("diff", 0) + ) + self.repo_phid = get_session("phabricator", request).rel_url.query.get("repo") + self.revision_id = int( + get_session("phabricator", request).rel_url.query.get("revision", 0) + ) + self.target_phid = get_session("phabricator", request).rel_url.query.get( + "target" + ) self.state = PhabricatorBuildState.Queued # Incremented on an unexpected failure during build's push to try self.retries = 0 diff --git a/libmozevent/utils.py b/libmozevent/utils.py index c8c6d2b..8e2bbaa 100644 --- a/libmozevent/utils.py +++ b/libmozevent/utils.py @@ -8,6 +8,7 @@ import os import signal import time +from functools import lru_cache from typing import Iterable import hglib @@ -22,10 +23,29 @@ from redis.exceptions import ResponseError from redis.exceptions import TimeoutError from redis.exceptions import WatchError +from requests.packages.urllib3.util.retry import Retry log = structlog.get_logger(__name__) +@lru_cache(maxsize=None) +def get_session(name: str, requests): + session = requests.Session() + + retry = Retry(total=9, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504]) + + # Default HTTPAdapter uses 10 connections. Mount custom adapter to increase + # that limit. Connections are established as needed, so using a large value + # should not negatively impact performance. + http_adapter = requests.adapters.HTTPAdapter( + pool_connections=50, pool_maxsize=50, max_retries=retry + ) + session.mount("https://", http_adapter) + session.mount("http://", http_adapter) + + return session + + def run_tasks(awaitables: Iterable, bus_to_restore=None): """ Helper to run tasks concurrently.