diff --git a/requirements.txt b/requirements.txt
index 87e7f99f638cf0597e10a14069fa6ba64f650765..90d46982e6761da9d04675a8d7c09cdeddd181ad 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -8,6 +8,7 @@ iso8601
 pkginfo
 python-debian
 python-dateutil
+tenacity >= 8.4.2
 typing-extensions
 toml
 packaging
diff --git a/swh/loader/core/tests/test_loader.py b/swh/loader/core/tests/test_loader.py
index 999a4dcf3af46fd8a478c9a24c68d57770371398..5af3054dc3c2b219a8640b235dc301915a6070e4 100644
--- a/swh/loader/core/tests/test_loader.py
+++ b/swh/loader/core/tests/test_loader.py
@@ -21,7 +21,6 @@ from swh.loader.core.loader import (
     BaseLoader,
     ContentLoader,
     TarballDirectoryLoader,
-    download_orig,
 )
 from swh.loader.core.metadata_fetchers import MetadataFetcherProtocol
 from swh.loader.core.tests.dummy_loader import (
@@ -625,7 +624,13 @@ def test_directory_loader_404_with_fallback(
 
 
 def test_directory_loader_500_with_fallback(
-    caplog, swh_storage, requests_mock_datadir, tarball_path, requests_mock, mocker
+    caplog,
+    swh_storage,
+    requests_mock_datadir,
+    tarball_path,
+    requests_mock,
+    mocker,
+    mock_sleep,
 ):
     """It should not ingest origin when there is no tarball to be found"""
     unknown_origin = Origin(f"{DIRECTORY_MIRROR}/archives/unknown.tbz2")
@@ -633,8 +638,6 @@ def test_directory_loader_500_with_fallback(
     requests_mock.get(unknown_origin.url, status_code=500)
     requests_mock.get(fallback_url_ko, status_code=500)
 
-    mock_sleep = mocker.patch.object(download_orig.retry, "sleep")
-
     loader = TarballDirectoryLoader(
         swh_storage,
         unknown_origin.url,
diff --git a/swh/loader/pytest_plugin.py b/swh/loader/pytest_plugin.py
index 19e9db97f4e76afcd38a7308063a4cfc5a1c52ed..1b148220b4788ab3bf31f8f6db4fb92488a4619b 100644
--- a/swh/loader/pytest_plugin.py
+++ b/swh/loader/pytest_plugin.py
@@ -9,11 +9,15 @@ from typing import Any, Dict
 import pytest
 import yaml
 
-from swh.loader.core.utils import download, get_url_body
 from swh.scheduler.model import ListedOrigin, Lister
 from swh.scheduler.utils import create_origin_task
 
 
+@pytest.fixture(autouse=True)
+def mock_sleep(mocker):
+    return mocker.patch("time.sleep")
+
+
 @pytest.fixture
 def swh_storage_backend_config(swh_storage_postgresql) -> Dict[str, Any]:
     return {
@@ -64,7 +68,12 @@ def loading_task_creation_for_listed_origin_test(
     swh_scheduler_celery_app,
     swh_scheduler_celery_worker,
     swh_config,
+    mock_sleep,
 ):
+    # unset mocking of time.sleep as celery task execution takes
+    # too many time otherwise
+    mocker.stop(mock_sleep)
+
     def test_implementation(
         loader_class_name: str,
         task_function_name: str,
@@ -73,7 +82,6 @@ def loading_task_creation_for_listed_origin_test(
     ):
         mock_load = mocker.patch(f"{loader_class_name}.load")
         mock_load.return_value = {"status": "eventful"}
-
         task = create_origin_task(listed_origin, lister)
 
         res = swh_scheduler_celery_app.send_task(
@@ -81,15 +89,10 @@ def loading_task_creation_for_listed_origin_test(
             kwargs=task.arguments.kwargs,
         )
         assert res
+
         res.wait()
         assert res.successful()
         assert mock_load.called
         assert res.result == {"status": "eventful"}
 
     return test_implementation
-
-
-@pytest.fixture(autouse=True)
-def mock_retry_sleep(mocker):
-    mocker.patch.object(download.retry, "sleep")
-    mocker.patch.object(get_url_body.retry, "sleep")