Skip to content

Commit 15ff423

Browse files
committed
Added retry middleware to aiohttp musl requests
I have been notified by @guyush1 that the website is unstable, so we retry the download 5 times.
1 parent 8adc0f8 commit 15ff423

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

Dockerfile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,16 @@ RUN apt update && apt install -y \
2525
patch \
2626
pkg-config \
2727
python3.12 \
28-
python3-aiohttp \
28+
python3-pip \
2929
libpython3-dev \
3030
texinfo \
3131
wget \
3232
xz-utils
3333

34+
# We require aiohttp >= 3.12 (For client middleware support), which is newer than the currently
35+
# available python3-aiohttp's version in Ubuntu.
36+
RUN python3.12 -m pip install --break-system-packages aiohttp
37+
3438
COPY src/docker_utils/download_musl_toolchains.py .
3539
RUN python3.12 -u download_musl_toolchains.py
3640

src/docker_utils/download_musl_toolchains.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/usr/bin/env python3.12
22

3-
from typing import List
43
from pathlib import Path
4+
from typing import List
55

66
import tarfile
77
import tempfile
@@ -23,9 +23,24 @@
2323
MUSL_TOOLCHAINS_DIR = Path("/musl-toolchains")
2424
ENTRYPOINT = Path("/entrypoint.sh")
2525

26+
NUM_RETRIES = 5
27+
RETRY_WAIT = 2
28+
29+
# Basically copied from aiohttp docs: Simple Retry Middleware
30+
async def retry_middleware(req: aiohttp.ClientRequest, handler: aiohttp.ClientHandlerType) -> aiohttp.ClientResponse:
31+
for _ in range(NUM_RETRIES):
32+
resp = await handler(req)
33+
if resp.ok:
34+
return resp
35+
36+
await asyncio.sleep(RETRY_WAIT)
37+
38+
return resp
39+
2640
async def download_file(url: str, filename: str):
27-
async with aiohttp.ClientSession() as session:
41+
async with aiohttp.ClientSession(middlewares=(retry_middleware,)) as session:
2842
async with session.get(url) as response:
43+
response.raise_for_status()
2944
with open(filename, 'wb') as f:
3045
async for data in response.content.iter_chunked(CHUNK_SIZE):
3146
f.write(data)

0 commit comments

Comments
 (0)