Cache the main github api instances

this leads to a shared session, and a bit fewer requests
This commit is contained in:
Christoph Reiter 2022-04-30 16:16:54 +02:00
parent 099438dc3f
commit 133ce88284

View File

@ -28,6 +28,7 @@ import tempfile
import shutil import shutil
import json import json
import io import io
from functools import cache
from datetime import datetime, timezone from datetime import datetime, timezone
from enum import Enum from enum import Enum
from hashlib import sha256 from hashlib import sha256
@ -109,6 +110,7 @@ REQUESTS_TIMEOUT = (15, 30)
REQUESTS_RETRY = Retry(total=3, backoff_factor=1) REQUESTS_RETRY = Retry(total=3, backoff_factor=1)
@cache
def get_requests_session() -> requests.Session: def get_requests_session() -> requests.Session:
adapter = HTTPAdapter(max_retries=REQUESTS_RETRY) adapter = HTTPAdapter(max_retries=REQUESTS_RETRY)
http = requests.Session() http = requests.Session()
@ -117,9 +119,6 @@ def get_requests_session() -> requests.Session:
return http return http
REQUESTS_SESSION = get_requests_session()
class PackageStatus(Enum): class PackageStatus(Enum):
FINISHED = 'finished' FINISHED = 'finished'
FINISHED_BUT_BLOCKED = 'finished-but-blocked' FINISHED_BUT_BLOCKED = 'finished-but-blocked'
@ -328,7 +327,8 @@ def get_asset_mtime_ns(asset: GitReleaseAsset) -> int:
def download_asset(asset: GitReleaseAsset, target_path: str) -> None: def download_asset(asset: GitReleaseAsset, target_path: str) -> None:
assert asset_is_complete(asset) assert asset_is_complete(asset)
with REQUESTS_SESSION.get(asset.browser_download_url, stream=True, timeout=REQUESTS_TIMEOUT) as r: session = get_requests_session()
with session.get(asset.browser_download_url, stream=True, timeout=REQUESTS_TIMEOUT) as r:
r.raise_for_status() r.raise_for_status()
fd, temppath = tempfile.mkstemp() fd, temppath = tempfile.mkstemp()
try: try:
@ -348,7 +348,8 @@ def download_asset(asset: GitReleaseAsset, target_path: str) -> None:
def download_text_asset(asset: GitReleaseAsset) -> str: def download_text_asset(asset: GitReleaseAsset) -> str:
assert asset_is_complete(asset) assert asset_is_complete(asset)
with REQUESTS_SESSION.get(asset.browser_download_url, timeout=REQUESTS_TIMEOUT) as r: session = get_requests_session()
with session.get(asset.browser_download_url, timeout=REQUESTS_TIMEOUT) as r:
r.raise_for_status() r.raise_for_status()
return r.text return r.text
@ -654,7 +655,8 @@ def run_build(args: Any) -> None:
def get_buildqueue() -> List[Package]: def get_buildqueue() -> List[Package]:
pkgs = [] pkgs = []
r = REQUESTS_SESSION.get("https://packages.msys2.org/api/buildqueue2", timeout=REQUESTS_TIMEOUT) session = get_requests_session()
r = session.get("https://packages.msys2.org/api/buildqueue2", timeout=REQUESTS_TIMEOUT)
r.raise_for_status() r.raise_for_status()
for received in r.json(): for received in r.json():
@ -1157,7 +1159,8 @@ def write_build_plan(args: Any) -> None:
def queue_website_update() -> None: def queue_website_update() -> None:
r = REQUESTS_SESSION.post('https://packages.msys2.org/api/trigger_update', timeout=REQUESTS_TIMEOUT) session = get_requests_session()
r = session.post('https://packages.msys2.org/api/trigger_update', timeout=REQUESTS_TIMEOUT)
try: try:
# it's not worth stopping the build if this fails, so just log it # it's not worth stopping the build if this fails, so just log it
r.raise_for_status() r.raise_for_status()
@ -1535,6 +1538,7 @@ def get_credentials(readonly: bool = True) -> Dict[str, Any]:
raise Exception("'GITHUB_TOKEN' env var not set") raise Exception("'GITHUB_TOKEN' env var not set")
@cache
def get_github(readonly: bool = True) -> Github: def get_github(readonly: bool = True) -> Github:
kwargs = get_credentials(readonly=readonly) kwargs = get_credentials(readonly=readonly)
has_creds = bool(kwargs) has_creds = bool(kwargs)
@ -1548,6 +1552,7 @@ def get_github(readonly: bool = True) -> Github:
return gh return gh
@cache
def get_main_repo(readonly: bool = True) -> Repository: def get_main_repo(readonly: bool = True) -> Repository:
gh = get_github(readonly=readonly) gh = get_github(readonly=readonly)
return gh.get_repo(Config.MAIN_REPO, lazy=True) return gh.get_repo(Config.MAIN_REPO, lazy=True)