From d94148ff7999e0ecee9b617c4daec24da28ea1a5 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Thu, 18 Jan 2018 15:04:41 +0100 Subject: [PATCH 1/3] Prevent reloading when data table is being modified Fixes https://github.com/galaxyproject/galaxy/issues/4783. --- lib/galaxy/tools/data_manager/manager.py | 8 ++++---- lib/galaxy/tools/toolbox/watcher.py | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/tools/data_manager/manager.py b/lib/galaxy/tools/data_manager/manager.py index 05d3a9b3e1b..1dfa973abed 100644 --- a/lib/galaxy/tools/data_manager/manager.py +++ b/lib/galaxy/tools/data_manager/manager.py @@ -317,10 +317,10 @@ class DataManager(object): self.process_move(data_table_name, name, output_ref_values[name].extra_files_path, **data_table_value) data_table_value[name] = self.process_value_translation(data_table_name, name, **data_table_value) data_table.add_entry(data_table_value, persist=True, entry_source=self) - send_control_task(self.data_managers.app, - 'reload_tool_data_tables', - noop_self=True, - kwargs={'table_name': data_table_name}) + send_control_task(self.data_managers.app, + 'reload_tool_data_tables', + noop_self=True, + kwargs={'table_name': data_table_name}) if self.undeclared_tables and data_tables_dict: # We handle the data move, by just moving all the data out of the extra files path # moving a directory and the target already exists, we move the contents instead diff --git a/lib/galaxy/tools/toolbox/watcher.py b/lib/galaxy/tools/toolbox/watcher.py index ffe1144b53e..23f8d2423ee 100644 --- a/lib/galaxy/tools/toolbox/watcher.py +++ b/lib/galaxy/tools/toolbox/watcher.py @@ -252,6 +252,10 @@ class LocFileEventHandler(FileSystemEventHandler): if self.loc_watcher.path_hash.get(path) == cur_hash: return else: + time.sleep(0.5) + if cur_hash != md5_hash_file(path): + # We're still modifying the file, it'll be picked up later + return self.loc_watcher.path_hash[path] = cur_hash self.loc_watcher.tool_data_tables.reload_tables(path=path) From 8c1807c2879950ef47ccd162b6a7eebc83bc892b Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Thu, 18 Jan 2018 15:17:08 +0100 Subject: [PATCH 2/3] Trigger reload for each modified data table In unindeted one level too much in the previous commit, which would only reload the last table (thanks @dannon). The alternative would be to reload all tables, but I think this is more efficient. --- lib/galaxy/tools/data_manager/manager.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/tools/data_manager/manager.py b/lib/galaxy/tools/data_manager/manager.py index 1dfa973abed..25f8b49f020 100644 --- a/lib/galaxy/tools/data_manager/manager.py +++ b/lib/galaxy/tools/data_manager/manager.py @@ -317,10 +317,10 @@ class DataManager(object): self.process_move(data_table_name, name, output_ref_values[name].extra_files_path, **data_table_value) data_table_value[name] = self.process_value_translation(data_table_name, name, **data_table_value) data_table.add_entry(data_table_value, persist=True, entry_source=self) - send_control_task(self.data_managers.app, - 'reload_tool_data_tables', - noop_self=True, - kwargs={'table_name': data_table_name}) + send_control_task(self.data_managers.app, + 'reload_tool_data_tables', + noop_self=True, + kwargs={'table_name': data_table_name}) if self.undeclared_tables and data_tables_dict: # We handle the data move, by just moving all the data out of the extra files path # moving a directory and the target already exists, we move the contents instead From 8f91ae0db9f0ebdc06e6e284fb2fb254db553181 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Thu, 18 Jan 2018 15:25:36 +0100 Subject: [PATCH 3/3] Reload tool data tables for 'undeclared_tables' Thanks @nsoranzo! --- lib/galaxy/tools/data_manager/manager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/galaxy/tools/data_manager/manager.py b/lib/galaxy/tools/data_manager/manager.py index 25f8b49f020..0d6e8ea157d 100644 --- a/lib/galaxy/tools/data_manager/manager.py +++ b/lib/galaxy/tools/data_manager/manager.py @@ -338,9 +338,9 @@ class DataManager(object): if name in path_column_names: data_table_value[name] = os.path.abspath(os.path.join(self.data_managers.app.config.galaxy_data_manager_data_path, value)) data_table.add_entry(data_table_value, persist=True, entry_source=self) - send_control_task(self.data_managers.app, 'reload_tool_data_tables', - noop_self=True, - kwargs={'table_name': data_table_name}) + send_control_task(self.data_managers.app, 'reload_tool_data_tables', + noop_self=True, + kwargs={'table_name': data_table_name}) else: for data_table_name, data_table_values in data_tables_dict.items(): # tool returned extra data table entries, but data table was not declared in data manager