diff --git a/arq/worker.py b/arq/worker.py index f1e613c9..6058f66a 100644 --- a/arq/worker.py +++ b/arq/worker.py @@ -617,7 +617,7 @@ async def job_failed(exc: BaseException) -> None: finish = True self.aborting_tasks.remove(job_id) self.jobs_failed += 1 - elif self.retry_jobs and isinstance(e, (asyncio.CancelledError, RetryJob)): + elif self.retry_jobs and isinstance(e, (asyncio.CancelledError, asyncio.TimeoutError, RetryJob)): logger.info('%6.2fs ↻ %s cancelled, will be run again', t, ref) self.jobs_retried += 1 else: diff --git a/tests/test_worker.py b/tests/test_worker.py index 93fbc7f0..38e5e124 100644 --- a/tests/test_worker.py +++ b/tests/test_worker.py @@ -974,18 +974,19 @@ async def test_job_timeout(arq_redis: ArqRedis, worker, caplog): async def longfunc(ctx): await asyncio.sleep(0.3) - caplog.set_level(logging.ERROR) + caplog.set_level(logging.INFO) await arq_redis.enqueue_job('longfunc', _job_id='testing') worker: Worker = worker(functions=[func(longfunc, name='longfunc')], job_timeout=0.2, poll_delay=0.1) assert worker.jobs_complete == 0 assert worker.jobs_failed == 0 assert worker.jobs_retried == 0 + assert worker.retry_jobs await worker.main() assert worker.jobs_complete == 0 assert worker.jobs_failed == 1 - assert worker.jobs_retried == 0 + assert worker.jobs_retried == worker.max_tries log = re.sub(r'\d+.\d\ds', 'X.XXs', '\n'.join(r.message for r in caplog.records)) - assert 'X.XXs ! testing:longfunc failed, TimeoutError:' in log + assert f'X.XXs ! testing:longfunc max retries {worker.max_tries} exceeded' in log async def test_on_job(arq_redis: ArqRedis, worker):