From d69940d276f2127ac8022e3965126939e57164d4 Mon Sep 17 00:00:00 2001
From: Valentin Rigal <rigal@teklia.com>
Date: Wed, 19 May 2021 11:04:07 +0200
Subject: [PATCH] Handle backend 409 conflict error code

---
 arkindex_worker/worker/__init__.py | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/arkindex_worker/worker/__init__.py b/arkindex_worker/worker/__init__.py
index c34a24ae..77412c47 100644
--- a/arkindex_worker/worker/__init__.py
+++ b/arkindex_worker/worker/__init__.py
@@ -128,17 +128,25 @@ class ElementsWorker(
 
                 # Process the element and report its progress if activities are enabled
                 response = self.update_activity(element.id, ActivityState.Started)
-                if isinstance(response, ErrorResponse) and response.status_code == 400:
-                    # Bad request error when setting an activity to "started" mean that we cannot
+                if isinstance(response, ErrorResponse) and response.status_code == 409:
+                    # 409 conflict error when setting 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.
-                    # Element is not counted as failed as it is handled by another process.
-                    logger.info(
-                        f'Cannot start processing element "{element.id}". '
+                    # Element is not counted as failed as it is probably handled by another process.
+                    logger.warning(
+                        f"Cannot start processing element {element.id} due to a conflict. "
                         "Another process could have processed it with the same version already."
                     )
                     continue
+                elif isinstance(response, Exception):
+                    # Count the element as failed in case the activity update to "started" failed with no conflict.
+                    # This prevent from processing the element
+                    logger.warning(
+                        f"Element {element.id} is counted as failed because its activity could not be initialized."
+                    )
+                    failed += 1
+                    continue
                 self.process_element(element)
                 self.update_activity(element.id, ActivityState.Processed)
             except Exception as e:
@@ -217,3 +225,4 @@ class ElementsWorker(
             logger.warning(
                 f"Failed to update activity of element {element_id} to {state.value}: {e}"
             )
+            return e
-- 
GitLab