From 484a77a3adcebf046bba1b2eac0c915abd631213 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Wed, 23 Nov 2022 18:11:37 +0100 Subject: [PATCH 1/3] integrate ftrack api always create new session for each instance processing --- .../plugins/publish/integrate_ftrack_api.py | 56 ++++++++++++++++--- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/openpype/modules/ftrack/plugins/publish/integrate_ftrack_api.py b/openpype/modules/ftrack/plugins/publish/integrate_ftrack_api.py index 159e60024d..1d65a53a4a 100644 --- a/openpype/modules/ftrack/plugins/publish/integrate_ftrack_api.py +++ b/openpype/modules/ftrack/plugins/publish/integrate_ftrack_api.py @@ -36,10 +36,42 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin): return context = instance.context - session = context.data["ftrackSession"] + task_entity, parent_entity = self.get_instance_entities( + instance, context) + if parent_entity is None: + self.log.info(( + "Skipping ftrack integration. Instance \"{}\" does not" + " have specified ftrack entities." + ).format(str(instance))) + return + context_session = context.data["ftrackSession"] + ftrack_api = context.data["ftrackPythonModule"] + # Create new session for uploading + # - this was added to prevent failed uploads due to connection lost + # it is possible it won't fix the issue and potentially make it worse + # in that case new session should not be created and should not be + # closed at the end. + # - also rename variable 'context_session' -> 'session' + session = ftrack_api.Session( + context_session.server_url, + context_session.api_key, + context_session.api_user, + auto_connect_event_hub=False, + ) + try: + self.integrate_to_ftrack( + session, + instance, + task_entity, + parent_entity, + component_list + ) + finally: + session.close() + + def get_instance_entities(self, instance, context): parent_entity = None - default_asset_name = None # If instance has set "ftrackEntity" or "ftrackTask" then use them from # instance. Even if they are set to None. If they are set to None it # has a reason. (like has different context) @@ -52,15 +84,21 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin): parent_entity = context.data.get("ftrackEntity") if task_entity: - default_asset_name = task_entity["name"] parent_entity = task_entity["parent"] - if parent_entity is None: - self.log.info(( - "Skipping ftrack integration. Instance \"{}\" does not" - " have specified ftrack entities." - ).format(str(instance))) - return + return task_entity, parent_entity + + def integrate_to_ftrack( + self, + session, + instance, + task_entity, + parent_entity, + component_list + ): + default_asset_name = None + if task_entity: + default_asset_name = task_entity["name"] if not default_asset_name: default_asset_name = parent_entity["name"] From f821337a8ee552aa91d5c7d7275c3a1d82bd3c24 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Wed, 23 Nov 2022 18:56:17 +0100 Subject: [PATCH 2/3] don't create and close existing connections --- .../plugins/publish/integrate_ftrack_api.py | 52 +++++-------------- 1 file changed, 13 insertions(+), 39 deletions(-) diff --git a/openpype/modules/ftrack/plugins/publish/integrate_ftrack_api.py b/openpype/modules/ftrack/plugins/publish/integrate_ftrack_api.py index 1d65a53a4a..231bd8e81e 100644 --- a/openpype/modules/ftrack/plugins/publish/integrate_ftrack_api.py +++ b/openpype/modules/ftrack/plugins/publish/integrate_ftrack_api.py @@ -40,25 +40,15 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin): instance, context) if parent_entity is None: self.log.info(( - "Skipping ftrack integration. Instance \"{}\" does not" - " have specified ftrack entities." + "Skipping ftrack integration. Instance \"{}\" does not" + " have specified ftrack entities." ).format(str(instance))) return - context_session = context.data["ftrackSession"] - ftrack_api = context.data["ftrackPythonModule"] - # Create new session for uploading - # - this was added to prevent failed uploads due to connection lost - # it is possible it won't fix the issue and potentially make it worse - # in that case new session should not be created and should not be - # closed at the end. - # - also rename variable 'context_session' -> 'session' - session = ftrack_api.Session( - context_session.server_url, - context_session.api_key, - context_session.api_user, - auto_connect_event_hub=False, - ) + session = context.data["ftrackSession"] + # Reset session and reconfigure locations + session.reset() + try: self.integrate_to_ftrack( session, @@ -67,8 +57,10 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin): parent_entity, component_list ) - finally: - session.close() + + except Exception: + session.reset() + raise def get_instance_entities(self, instance, context): parent_entity = None @@ -224,13 +216,7 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin): self.log.info("Setting task status to \"{}\"".format(status_name)) task_entity["status"] = status - try: - session.commit() - except Exception: - tp, value, tb = sys.exc_info() - session.rollback() - session._configure_locations() - six.reraise(tp, value, tb) + session.commit() def _fill_component_locations(self, session, component_list): components_by_location_name = collections.defaultdict(list) @@ -533,13 +519,7 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin): session.delete(member) del(member) - try: - session.commit() - except Exception: - tp, value, tb = sys.exc_info() - session.rollback() - session._configure_locations() - six.reraise(tp, value, tb) + session.commit() # Reset members in memory if "members" in component_entity.keys(): @@ -655,13 +635,7 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin): ) else: # Commit changes. - try: - session.commit() - except Exception: - tp, value, tb = sys.exc_info() - session.rollback() - session._configure_locations() - six.reraise(tp, value, tb) + session.commit() def _create_components(self, session, asset_versions_data_by_id): for item in asset_versions_data_by_id.values(): From 7544771744427522841e580ac1cee4945b6d07d4 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Thu, 1 Dec 2022 13:29:18 +0100 Subject: [PATCH 3/3] replace reset with configure locations --- .../modules/ftrack/plugins/publish/integrate_ftrack_api.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openpype/modules/ftrack/plugins/publish/integrate_ftrack_api.py b/openpype/modules/ftrack/plugins/publish/integrate_ftrack_api.py index 231bd8e81e..0e8209866f 100644 --- a/openpype/modules/ftrack/plugins/publish/integrate_ftrack_api.py +++ b/openpype/modules/ftrack/plugins/publish/integrate_ftrack_api.py @@ -46,8 +46,9 @@ class IntegrateFtrackApi(pyblish.api.InstancePlugin): return session = context.data["ftrackSession"] - # Reset session and reconfigure locations - session.reset() + # Reset session operations and reconfigure locations + session.recorded_operations.clear() + session._configure_locations() try: self.integrate_to_ftrack(