From 54357f38e9929f3f3a084f298bd644395976a91a Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Fri, 29 Sep 2017 18:27:10 +0200 Subject: [PATCH] Write out registry.xml file in case jobs are missing this file --- lib/galaxy/jobs/handler.py | 11 +++++++++++ lib/galaxy_ext/metadata/set_metadata.py | 10 ++++++++++ 2 files changed, 21 insertions(+) diff --git a/lib/galaxy/jobs/handler.py b/lib/galaxy/jobs/handler.py index 93c80c438932..80d538bfd4e6 100644 --- a/lib/galaxy/jobs/handler.py +++ b/lib/galaxy/jobs/handler.py @@ -93,6 +93,16 @@ def job_pair_for_id( self, id ): job = self.sa_session.query( model.Job ).get( id ) return job, self.job_wrapper( job, use_persisted_destination=True ) + def __write_registry_file_if_absent(self, job): + job_wrapper = self.job_wrapper(job) + cwd = job_wrapper.working_directory + datatypes_config = os.path.join(cwd, "registry.xml") + if not os.path.exists(datatypes_config): + try: + self.app.datatypes_registry.to_xml_file(path=datatypes_config) + except OSError: + pass + def __check_jobs_at_startup( self ): """ Checks all jobs that are in the 'new', 'queued' or 'running' state in @@ -120,6 +130,7 @@ def __check_jobs_at_startup( self ): ( model.Job.handler == self.app.config.server_name ) ).all() for job in jobs_at_startup: + self.__write_registry_file_if_absent(job) if not self.app.toolbox.has_tool( job.tool_id, job.tool_version, exact=True ): log.warning( "(%s) Tool '%s' removed from tool config, unable to recover job" % ( job.id, job.tool_id ) ) self.job_wrapper( job ).fail( 'This tool was disabled before the job completed. Please contact your Galaxy administrator.' ) diff --git a/lib/galaxy_ext/metadata/set_metadata.py b/lib/galaxy_ext/metadata/set_metadata.py index 6f70a9d0f633..57080c5c2831 100644 --- a/lib/galaxy_ext/metadata/set_metadata.py +++ b/lib/galaxy_ext/metadata/set_metadata.py @@ -81,6 +81,16 @@ def set_metadata(): # Set up datatypes registry datatypes_config = sys.argv.pop( 1 ) + if not os.path.exists(datatypes_config): + # This path should exist, except for jobs that started running on release 17.05, where a global + # datatypes_config (instead of a datatypes_config per job) was used. For a while release 17.05 + # would remove the global datatypes config on shutdown and toolbox reload, which would lead to + # failed metadata jobs. To remedy this we scan jobs at startup for missing registry.xml files, + # and if we detect such a job we write out the current registry.xml file. + datatypes_config = os.path.join(tool_job_working_directory, "registry.xml") + if not os.path.exists(datatypes_config): + print("Metadata setting failed because registry.xml could not be found. You may retry setting metadata.") + sys.exit(1) datatypes_registry = galaxy.datatypes.registry.Registry() datatypes_registry.load_datatypes( root_dir=galaxy_root, config=datatypes_config ) galaxy.model.set_datatypes_registry( datatypes_registry )