From 15915b0ae60e8967eb4f8fccfb286a3bff04bbe7 Mon Sep 17 00:00:00 2001 From: Ihor Sokhan Date: Wed, 4 Jun 2025 17:07:43 +0300 Subject: [PATCH 1/3] remove caching for ascendants --- osf/models/node.py | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/osf/models/node.py b/osf/models/node.py index 83d646cc717..71d960670dd 100644 --- a/osf/models/node.py +++ b/osf/models/node.py @@ -57,7 +57,7 @@ ) from osf.utils.datetime_aware_jsonfield import DateTimeAwareJSONField from osf.utils.fields import NonNaiveDateTimeField -from osf.utils.requests import get_request_and_user_id, string_type_request_headers, get_current_request +from osf.utils.requests import get_request_and_user_id, string_type_request_headers from osf.utils.workflows import CollectionSubmissionStates from osf.utils import sanitize from website import language, settings @@ -2467,21 +2467,15 @@ def _remove_from_associated_collections(self, auth=None, force=False): ) def _get_addon_from_gv(self, gv_pk, requesting_user_id, auth=None): - request = get_current_request() - # This is to avoid making multiple requests to GV - # within the lifespan of one request on the OSF side - try: - gv_addons = request.gv_addons - except AttributeError: - requesting_user = OSFUser.load(requesting_user_id) - services = gv_translations.get_external_services(requesting_user) - for service in services: - if service.short_name == gv_pk: - break - else: - return None - gv_addons = request.gv_addons = self._get_addons_from_gv(requesting_user_id, service.type, auth=auth) + requesting_user = OSFUser.load(requesting_user_id) + services = gv_translations.get_external_services(requesting_user) + for service in services: + if service.short_name == gv_pk: + break + else: + return None + gv_addons = self._get_addons_from_gv(requesting_user_id, service.type, auth=auth) for item in gv_addons: if item.short_name == gv_pk: return item From f42f67dc4d61efcb6540a007b5af3833a926f070 Mon Sep 17 00:00:00 2001 From: Ihor Sokhan Date: Tue, 10 Jun 2025 13:17:04 +0300 Subject: [PATCH 2/3] Revert "remove caching for ascendants" This reverts commit 15915b0ae60e8967eb4f8fccfb286a3bff04bbe7. --- osf/models/node.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/osf/models/node.py b/osf/models/node.py index 71d960670dd..83d646cc717 100644 --- a/osf/models/node.py +++ b/osf/models/node.py @@ -57,7 +57,7 @@ ) from osf.utils.datetime_aware_jsonfield import DateTimeAwareJSONField from osf.utils.fields import NonNaiveDateTimeField -from osf.utils.requests import get_request_and_user_id, string_type_request_headers +from osf.utils.requests import get_request_and_user_id, string_type_request_headers, get_current_request from osf.utils.workflows import CollectionSubmissionStates from osf.utils import sanitize from website import language, settings @@ -2467,15 +2467,21 @@ def _remove_from_associated_collections(self, auth=None, force=False): ) def _get_addon_from_gv(self, gv_pk, requesting_user_id, auth=None): - requesting_user = OSFUser.load(requesting_user_id) - services = gv_translations.get_external_services(requesting_user) - for service in services: - if service.short_name == gv_pk: - break - else: - return None + request = get_current_request() + # This is to avoid making multiple requests to GV + # within the lifespan of one request on the OSF side + try: + gv_addons = request.gv_addons + except AttributeError: + requesting_user = OSFUser.load(requesting_user_id) + services = gv_translations.get_external_services(requesting_user) + for service in services: + if service.short_name == gv_pk: + break + else: + return None + gv_addons = request.gv_addons = self._get_addons_from_gv(requesting_user_id, service.type, auth=auth) - gv_addons = self._get_addons_from_gv(requesting_user_id, service.type, auth=auth) for item in gv_addons: if item.short_name == gv_pk: return item From ec2c7c0aac844e1e9140b09e6fed80d0df157871 Mon Sep 17 00:00:00 2001 From: Ihor Sokhan Date: Tue, 10 Jun 2025 17:01:21 +0300 Subject: [PATCH 3/3] use GV addons caching when it's needed --- osf/models/archive.py | 2 +- osf/models/mixins.py | 4 ++-- osf/models/node.py | 31 +++++++++++++++++++------------ 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/osf/models/archive.py b/osf/models/archive.py index 052d918a99c..9e622764ca7 100644 --- a/osf/models/archive.py +++ b/osf/models/archive.py @@ -146,7 +146,7 @@ def _set_target(self, addon_short_name): def set_targets(self): addons = [] - for addon in [self.src_node.get_addon(name) + for addon in [self.src_node.get_addon(name, cached=False) for name in settings.ADDONS_ARCHIVABLE if settings.ADDONS_ARCHIVABLE[name] != 'none']: if not addon or not isinstance(addon, BaseStorageAddon) or not addon.complete: diff --git a/osf/models/mixins.py b/osf/models/mixins.py index b7fe97b7ece..62e93ccc991 100644 --- a/osf/models/mixins.py +++ b/osf/models/mixins.py @@ -554,12 +554,12 @@ def get_or_add_addon(self, name, *args, **kwargs): return addon return self.add_addon(name, *args, **kwargs) - def get_addon(self, name, is_deleted=False, auth=None): + def get_addon(self, name, is_deleted=False, auth=None, cached=True): # Avoid test-breakages by avoiding early access to the request context if name not in self.OSF_HOSTED_ADDONS: request, user_id = get_request_and_user_id() if flag_is_active(request, features.ENABLE_GV): - return self._get_addon_from_gv(gv_pk=name, requesting_user_id=user_id, auth=auth) + return self._get_addon_from_gv(gv_pk=name, requesting_user_id=user_id, auth=auth, cached=cached) try: settings_model = self._settings_model(name) diff --git a/osf/models/node.py b/osf/models/node.py index 83d646cc717..abb4cda878f 100644 --- a/osf/models/node.py +++ b/osf/models/node.py @@ -2466,21 +2466,28 @@ def _remove_from_associated_collections(self, auth=None, force=False): force=True ) - def _get_addon_from_gv(self, gv_pk, requesting_user_id, auth=None): + def _get_addons_from_gv_without_caching(self, gv_pk, requesting_user_id, auth=None): + requesting_user = OSFUser.load(requesting_user_id) + services = gv_translations.get_external_services(requesting_user) + for service in services: + if service.short_name == gv_pk: + break + else: + return None + + return self._get_addons_from_gv(requesting_user_id, service.type, auth=auth) + + def _get_addon_from_gv(self, gv_pk, requesting_user_id, auth=None, cached=True): request = get_current_request() # This is to avoid making multiple requests to GV # within the lifespan of one request on the OSF side - try: - gv_addons = request.gv_addons - except AttributeError: - requesting_user = OSFUser.load(requesting_user_id) - services = gv_translations.get_external_services(requesting_user) - for service in services: - if service.short_name == gv_pk: - break - else: - return None - gv_addons = request.gv_addons = self._get_addons_from_gv(requesting_user_id, service.type, auth=auth) + if cached: + try: + gv_addons = request.gv_addons + except AttributeError: + gv_addons = request.gv_addons = self._get_addons_from_gv_without_caching(gv_pk, requesting_user_id, auth=auth) + else: + gv_addons = self._get_addons_from_gv_without_caching(gv_pk, requesting_user_id, auth=auth) for item in gv_addons: if item.short_name == gv_pk: