From 471707bd7dfa048a412aad9cdcc1d0b4aea70bc7 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Sun, 3 Sep 2017 13:13:56 +0200 Subject: [PATCH 1/3] Build converters_by_datatype only once per registry lifetime --- lib/galaxy/datatypes/registry.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/lib/galaxy/datatypes/registry.py b/lib/galaxy/datatypes/registry.py index f6a69c8a533..7a1629a0579 100644 --- a/lib/galaxy/datatypes/registry.py +++ b/lib/galaxy/datatypes/registry.py @@ -75,6 +75,7 @@ class Registry(object): self.xml_filename = None self._edam_formats_mapping = None self._edam_data_mapping = None + self._converters_by_datatype = None # Build sites self.build_sites = {} self.display_sites = {} @@ -797,16 +798,18 @@ class Registry(object): def get_converters_by_datatype(self, ext): """Returns available converters by source type""" - converters = odict() - source_datatype = type(self.get_datatype_by_extension(ext)) - for ext2, converters_dict in self.datatype_converters.items(): - converter_datatype = type(self.get_datatype_by_extension(ext2)) - if issubclass(source_datatype, converter_datatype): - converters.update(converters_dict) - # Ensure ext-level converters are present - if ext in self.datatype_converters.keys(): - converters.update(self.datatype_converters[ext]) - return converters + if not self._converters_by_datatype: + converters = odict() + source_datatype = type(self.get_datatype_by_extension(ext)) + for ext2, converters_dict in self.datatype_converters.items(): + converter_datatype = type(self.get_datatype_by_extension(ext2)) + if issubclass(source_datatype, converter_datatype): + converters.update(converters_dict) + # Ensure ext-level converters are present + if ext in self.datatype_converters.keys(): + converters.update(self.datatype_converters[ext]) + self._converters_by_datatype = converters + return self._converters_by_datatype def get_converter_by_target_type(self, source_ext, target_ext): """Returns a converter based on source and target datatypes""" From d1a2007275f128fea051ead55fb47d2c2686abf5 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Sun, 3 Sep 2017 13:35:33 +0200 Subject: [PATCH 2/3] Cache user roles during WorkRequestContext lifetime This speeds up building the tool module by a factor of 5. --- lib/galaxy/work/context.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/galaxy/work/context.py b/lib/galaxy/work/context.py index 5c35315d07f..02306dbf0e8 100644 --- a/lib/galaxy/work/context.py +++ b/lib/galaxy/work/context.py @@ -22,6 +22,7 @@ class WorkRequestContext(ProvidesAppContext, ProvidesUserContext, ProvidesHistor self.app = app self.security = app.security self.__user = user + self.__user_current_roles = None self.__history = history self.api_inherit_admin = False self.workflow_building_mode = workflow_building_mode @@ -40,6 +41,12 @@ class WorkRequestContext(ProvidesAppContext, ProvidesUserContext, ProvidesHistor """Return the current user if logged in or None.""" return self.__user + def get_current_user_roles(self): + if not self.__user_current_roles: + if self.__user: + self.__user_current_roles = self.__user.all_roles() + return self.__user_current_roles + def set_user(self, user): """Set the current user.""" raise NotImplementedError("Cannot change users from a work request context.") From 2d8b242e697a08775879fc873578b5f244d4d5cb Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Sun, 3 Sep 2017 16:57:18 +0200 Subject: [PATCH 3/3] Fix caching of `get_converters_by_datatype` result --- lib/galaxy/datatypes/registry.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/datatypes/registry.py b/lib/galaxy/datatypes/registry.py index 7a1629a0579..dd46b56626d 100644 --- a/lib/galaxy/datatypes/registry.py +++ b/lib/galaxy/datatypes/registry.py @@ -75,7 +75,7 @@ class Registry(object): self.xml_filename = None self._edam_formats_mapping = None self._edam_data_mapping = None - self._converters_by_datatype = None + self._converters_by_datatype = {} # Build sites self.build_sites = {} self.display_sites = {} @@ -798,7 +798,7 @@ class Registry(object): def get_converters_by_datatype(self, ext): """Returns available converters by source type""" - if not self._converters_by_datatype: + if ext not in self._converters_by_datatype: converters = odict() source_datatype = type(self.get_datatype_by_extension(ext)) for ext2, converters_dict in self.datatype_converters.items(): @@ -808,8 +808,8 @@ class Registry(object): # Ensure ext-level converters are present if ext in self.datatype_converters.keys(): converters.update(self.datatype_converters[ext]) - self._converters_by_datatype = converters - return self._converters_by_datatype + self._converters_by_datatype[ext] = converters + return self._converters_by_datatype[ext] def get_converter_by_target_type(self, source_ext, target_ext): """Returns a converter based on source and target datatypes"""