From 528bc322b2aa5962e88264986d57afb1fc00c610 Mon Sep 17 00:00:00 2001 From: Valentin Rigal <rigal@teklia.com> Date: Mon, 21 Jun 2021 13:14:18 +0200 Subject: [PATCH] Use the generic error catch and handle exceptions when patching to the Error state --- arkindex_worker/worker/__init__.py | 43 ++++++++++++------------------ 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/arkindex_worker/worker/__init__.py b/arkindex_worker/worker/__init__.py index 96135192..cc32636d 100644 --- a/arkindex_worker/worker/__init__.py +++ b/arkindex_worker/worker/__init__.py @@ -27,11 +27,6 @@ class ActivityState(Enum): Error = "error" -class ConflictResponse(ErrorResponse): - # Custom Exception type for HTTP 409 conflict - pass - - class ElementsWorker( BaseWorker, ClassificationMixin, @@ -134,24 +129,23 @@ class ElementsWorker( # Process the element and report its progress if activities are enabled try: self.update_activity(element.id, ActivityState.Started) - except ConflictResponse as e: - # Skip this element in case of conflict while initializing the activity + except ErrorResponse as e: + if e.status_code != 409: + raise e + # 409 conflict error when updating the state of an activity to "started" mean that we + # cannot process this element. We assume that the reason is that the state transition + # was forbidden i.e. that the activity was already in a started or processed state. + # This allow concurrent access to an element activity between multiple processes. + # Element should not be counted as failed as it is probably handled somewhere else. logger.warning( - f"Cannot start processing element {element.id} due to a conflict, " - f"another process could have processed it with the same version already: {e.content}" + f"Cannot start processing element {element.id} due to a conflict. " + f"Another process could have processed it with the same version already." ) continue self.process_element(element) - try: - self.update_activity(element.id, ActivityState.Processed) - except ConflictResponse as e: - # Do not count this element as failed - logger.warning( - f"Element {element.id} was processed but its activity could not be updated: {e.content}" - ) - continue + self.update_activity(element.id, ActivityState.Processed) except Exception as e: - # Handle errors occurring while retrieving, processing or patching the activity of the element + # Handle errors occurring while retrieving, processing or patching the activity for this element. # Count the element as failed in case the activity update to "started" failed with no conflict. # This prevent from processing the element failed += 1 @@ -169,7 +163,11 @@ class ElementsWorker( exc_info=e if self.args.verbose else None, ) if element: - self.update_activity(element.id, ActivityState.Error) + # Try to update the activity to error state regardless of the response + try: + self.update_activity(element.id, ActivityState.Error) + except Exception: + pass self.report.error(element_id, e) # Save report as local artifact @@ -221,13 +219,6 @@ class ElementsWorker( logger.warning( f"Failed to update activity of element {element_id} to {state.value} due to an API error: {e.content}" ) - # 409 conflict error when updating the state of an activity mean that we cannot - # process this element. We assume that the reason is that the state transition - # was forbidden i.e. that the activity was already in a started or processed state. - # This allow concurrent access to an element activity between multiple processes. - # Element should not be counted as failed as it is probably handled somewhere else. - if e.status_code == 409: - raise ConflictResponse(e) raise e logger.debug(f"Updated activity of element {element_id} to {state}") -- GitLab