diff --git a/datagateway_api/src/datagateway_api/icat/helpers.py b/datagateway_api/src/datagateway_api/icat/helpers.py index 285a01d2..3cffcdad 100644 --- a/datagateway_api/src/datagateway_api/icat/helpers.py +++ b/datagateway_api/src/datagateway_api/icat/helpers.py @@ -340,21 +340,19 @@ def get_data_with_filters( if reader_query.is_query_eligible_for_reader_performance(): log.info("Query is eligible to be passed as reader acount") if reader_query.is_user_authorised_to_see_entity_id(client): - # TODO - make reader client reuseable - if client_pool: - reader_client = get_cached_client(None, client_pool) - else: - reader_client = ICATClient("datagateway_api") - reader_config = Config.config.datagateway_api.use_reader_for_performance - login_credentals = { - "username": reader_config.reader_username, - "password": reader_config.reader_password, - } - reader_client.login(reader_config.reader_mechanism, login_credentals) + reader_client = ReaderQueryHandler.reader_client log.info("Query to be executed as reader account") - return execute_entity_query( - reader_client, entity_type, filters, aggregate=aggregate, - ) + try: + results = execute_entity_query( + reader_client, entity_type, filters, aggregate=aggregate, + ) + except ICATSessionError: + # re-login as reader and try the query again + reader_client = reader_query.create_reader_client() + results = execute_entity_query( + reader_client, entity_type, filters, aggregate=aggregate, + ) + return results else: raise AuthenticationError( "Not authorised to access the" diff --git a/datagateway_api/src/datagateway_api/icat/reader_query_handler.py b/datagateway_api/src/datagateway_api/icat/reader_query_handler.py index 9bc08632..f83c22a9 100644 --- a/datagateway_api/src/datagateway_api/icat/reader_query_handler.py +++ b/datagateway_api/src/datagateway_api/icat/reader_query_handler.py @@ -3,6 +3,7 @@ from datagateway_api.src.common.config import Config from datagateway_api.src.common.filter_order_handler import FilterOrderHandler from datagateway_api.src.datagateway_api.icat.filters import PythonICATWhereFilter +from datagateway_api.src.datagateway_api.icat.icat_client_pool import ICATClient from datagateway_api.src.datagateway_api.icat.query import ICATQuery log = logging.getLogger() @@ -13,6 +14,8 @@ class ReaderQueryHandler: # TODO - add docstrings entity_filter_check = {"Datafile": "dataset.id", "Dataset": "investigation.id"} entity_type_check = {"Datafile": "Dataset", "Dataset": "Investigation"} + # keep a cached reader_client for faster queries + reader_client = None def __init__(self, entity_type, filters): self.entity_type = entity_type @@ -22,6 +25,21 @@ def __init__(self, entity_type, filters): self.entity_type, ) self.reader_query_eligible = self.check_eligibility() + self.create_reader_client() + + def create_reader_client(self): + log.info("Creating reader_client") + ReaderQueryHandler.reader_client = ICATClient("datagateway_api") + reader_config = Config.config.datagateway_api.use_reader_for_performance + login_credentals = { + "username": reader_config.reader_username, + "password": reader_config.reader_password, + } + ReaderQueryHandler.reader_client.login( + reader_config.reader_mechanism, + login_credentals, + ) + return ReaderQueryHandler.reader_client def check_eligibility(self): reader_config = Config.config.datagateway_api.use_reader_for_performance