From c0085e3b2b92b291dc4983d9ba090686d63852e9 Mon Sep 17 00:00:00 2001
From: Bastien Abadie <bastien@nextcairn.com>
Date: Fri, 16 Oct 2020 13:27:22 +0200
Subject: [PATCH] Reload known ML classes when a 400 is received on creation

---
 arkindex_worker/worker.py | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/arkindex_worker/worker.py b/arkindex_worker/worker.py
index be46a870..fbec01a3 100644
--- a/arkindex_worker/worker.py
+++ b/arkindex_worker/worker.py
@@ -8,6 +8,7 @@ import uuid
 from enum import Enum
 from pathlib import Path
 
+import apistar
 import gnupg
 import yaml
 from apistar.exceptions import ErrorResponse
@@ -294,11 +295,23 @@ class ElementsWorker(BaseWorker):
         ml_class_id = self.classes[corpus_id].get(ml_class)
         if ml_class_id is None:
             logger.info(f"Creating ML class {ml_class} on corpus {corpus_id}")
-            response = self.api_client.request(
-                "CreateMLClass", id=corpus_id, body={"name": ml_class}
-            )
+            try:
+                response = self.api_client.request(
+                    "CreateMLClass", id=corpus_id, body={"name": ml_class}
+                )
+                logger.debug(f"Created ML class {response['id']}")
+            except apistar.exceptions.ErrorResponse as e:
+                # Only reload for 400 errors
+                if e.status_code != 400:
+                    raise
+
+                # Reload and make sure we have the class
+                self.load_corpus_classes(corpus_id)
+                assert (
+                    ml_class in self.classes[corpus_id]
+                ), "Missing class {ml_class} even after reloading"
+
             ml_class_id = self.classes[corpus_id][ml_class] = response["id"]
-            logger.debug(f"Created ML class {ml_class_id}")
 
         return ml_class_id
 
-- 
GitLab