diff --git a/admin/nodes/views.py b/admin/nodes/views.py index 83a1ae98a16..cad67a6cc2d 100644 --- a/admin/nodes/views.py +++ b/admin/nodes/views.py @@ -707,6 +707,12 @@ class NodeReindexShare(NodeMixin, View): def post(self, request, *args, **kwargs): node = self.get_object() update_share(node) + messages.success( + request, + 'Reindex request has been sent to SHARE. ' + 'Changes typically appear in OSF Search within about 5 minutes, ' + 'subject to background queue load and SHARE availability.' + ) update_admin_log( user_id=self.request.user.id, object_id=node._id, diff --git a/admin/preprints/views.py b/admin/preprints/views.py index cccc54fe1e9..909006ea91d 100644 --- a/admin/preprints/views.py +++ b/admin/preprints/views.py @@ -184,6 +184,12 @@ class PreprintReindexShare(PreprintMixin, View): def post(self, request, *args, **kwargs): preprint = self.get_object() update_share(preprint) + messages.success( + request, + 'Reindex request has been sent to SHARE. ' + 'Changes typically appear in OSF Search within about 5 minutes, ' + 'subject to background queue load and SHARE availability.' + ) update_admin_log( user_id=self.request.user.id, object_id=preprint._id, diff --git a/admin_tests/nodes/test_views.py b/admin_tests/nodes/test_views.py index aaea213b681..4b4ef182a43 100644 --- a/admin_tests/nodes/test_views.py +++ b/admin_tests/nodes/test_views.py @@ -302,6 +302,7 @@ class TestNodeReindex(AdminTestCase): def setUp(self): super().setUp() self.request = RequestFactory().post('/fake_path') + patch_messages(self.request) self.user = AuthUserFactory() self.node = ProjectFactory(creator=self.user) diff --git a/admin_tests/preprints/test_views.py b/admin_tests/preprints/test_views.py index a9d29d0d69e..c6075f3ead2 100644 --- a/admin_tests/preprints/test_views.py +++ b/admin_tests/preprints/test_views.py @@ -363,6 +363,7 @@ def test_reindex_preprint_share(self, preprint, req, mock_update_share): preprint.provider.save() count = AdminLogEntry.objects.count() + patch_messages(req) view = views.PreprintReindexShare() view = setup_log_view(view, req, guid=preprint._id) mock_update_share.reset_mock() diff --git a/api/share/utils.py b/api/share/utils.py index 438f2c738a6..583b148cb9e 100644 --- a/api/share/utils.py +++ b/api/share/utils.py @@ -6,6 +6,7 @@ import logging from django.apps import apps +from celery.utils.time import get_exponential_backoff_interval import requests from framework.celery_tasks import app as celery_app @@ -97,6 +98,20 @@ def task__update_share(self, guid: str, is_backfill=False, osfmap_partition_name _response.raise_for_status() except Exception as e: log_exception(e) + if _response.status_code == HTTPStatus.TOO_MANY_REQUESTS: + retry_after = _response.headers.get('Retry-After') + try: + countdown = int(retry_after) + except (TypeError, ValueError): + retries = getattr(self.request, 'retries', 0) + countdown = get_exponential_backoff_interval( + factor=4, + retries=retries, + maximum=2 * 60, + full_jitter=True, + ) + raise self.retry(exc=e, countdown=countdown) + if HTTPStatus(_response.status_code).is_server_error: raise self.retry(exc=e) else: # success response