| @@ -31,6 +31,10 @@ done_lock = asyncio.Lock() | |||||
| num_workers = 50 | num_workers = 50 | ||||
| class TooManyRequestsException(Exception): | |||||
| pass | |||||
| class PackagePOM: | class PackagePOM: | ||||
| def __init__(self, package: 'Package', pom: str): | def __init__(self, package: 'Package', pom: str): | ||||
| logger.debug(f'{package}: Parsing POM') | logger.debug(f'{package}: Parsing POM') | ||||
| @@ -153,7 +157,7 @@ class Package: | |||||
| return await response.text() | return await response.text() | ||||
| break | break | ||||
| elif response.status == 429: | elif response.status == 429: | ||||
| logger.error(f'{self}: HTTP error 429 (Too many requests). Retry after {response.headers["Retry-After"]}') | |||||
| raise TooManyRequestsException() | |||||
| else: | else: | ||||
| logger.error(f'{self}: HTTP error {response.status} from mirror {mirror}') | logger.error(f'{self}: HTTP error {response.status} from mirror {mirror}') | ||||
| else: | else: | ||||
| @@ -205,6 +209,8 @@ class Package: | |||||
| logger.warning(f'{self}: No matching packages found') | logger.warning(f'{self}: No matching packages found') | ||||
| self._verified = False | self._verified = False | ||||
| elif response.status == 429: | |||||
| raise TooManyRequestsException() | |||||
| else: | else: | ||||
| self._verified = False | self._verified = False | ||||
| logger.error(f'{self}: HTTP error {response.status} downloading pom') | logger.error(f'{self}: HTTP error {response.status} downloading pom') | ||||
| @@ -270,8 +276,15 @@ async def download(package: Package, queue: asyncio.Queue) -> None: | |||||
| async def worker(queue: asyncio.Queue) -> None: | async def worker(queue: asyncio.Queue) -> None: | ||||
| while True: | while True: | ||||
| package = await queue.get() | package = await queue.get() | ||||
| await download(package, queue) | |||||
| await asyncio.sleep(random.random()) | |||||
| while True: | |||||
| try: | |||||
| await download(package, queue) | |||||
| break | |||||
| except TooManyRequestsException: | |||||
| logger.debug('Too many requests. Delaying next attempt') | |||||
| await asyncio.sleep(3*random.random()) | |||||
| queue.task_done() | queue.task_done() | ||||