From 58234c72b8bf5fa11ba3c7d1323983d28fd149a7 Mon Sep 17 00:00:00 2001 From: chiaramapellimt Date: Mon, 18 May 2026 15:13:49 +0100 Subject: [PATCH] NIAD-3273 Fix DuplicatePrimaryKeyError on MHS Outbound retry by using upsert instead of insert Fix libxslt1-dev version pin across Dockerfiles NIAD-3273 Fix DuplicatePrimaryKeyError on MHS Outbound retry by using upsert instead of insert --- common/persistence/dynamo_persistence_adaptor.py | 7 +------ common/persistence/mongo_persistence_adaptor.py | 12 ++++++------ component-test.Dockerfile | 2 +- docker/inbound/Dockerfile | 2 +- docker/outbound/Dockerfile | 2 +- docker/spineroutelookup/Dockerfile | 2 +- .../component_persistence_adaptor_tests.py | 12 ++++-------- 7 files changed, 15 insertions(+), 24 deletions(-) diff --git a/common/persistence/dynamo_persistence_adaptor.py b/common/persistence/dynamo_persistence_adaptor.py index 1df11ec1e..31161b143 100644 --- a/common/persistence/dynamo_persistence_adaptor.py +++ b/common/persistence/dynamo_persistence_adaptor.py @@ -52,12 +52,7 @@ async def add(self, key, data): async with self.__get_dynamo_resource() as dynamo: table = await dynamo.Table(self.table_name) await table.put_item( - Item=self.add_primary_key_field(_KEY, key, data), - ConditionExpression=Attr(_KEY).not_exists()) - except ClientError as e: - if e.response['Error']['Code'] == 'ConditionalCheckFailedException': - raise DuplicatePrimaryKeyError - raise + Item=self.add_primary_key_field(_KEY, key, data)) except Exception as e: raise RecordCreationError from e diff --git a/common/persistence/mongo_persistence_adaptor.py b/common/persistence/mongo_persistence_adaptor.py index 8151d0ceb..01f9cb0b8 100644 --- a/common/persistence/mongo_persistence_adaptor.py +++ b/common/persistence/mongo_persistence_adaptor.py @@ -65,13 +65,13 @@ async def add(self, key: str, data: dict): logger.info('Adding data for {key} in table {table}', fparams={'key': key, 'table': self.table_name}) try: - result = await asyncio.to_thread( - lambda: self.collection.insert_one(self.add_primary_key_field(_KEY, key, data)) + await asyncio.to_thread( + lambda: self.collection.find_one_and_replace( + {_KEY: key}, + self.add_primary_key_field(_KEY, key, data), + upsert=True + ) ) - if not result.acknowledged: - raise RecordCreationError - except DuplicateKeyError as e: - raise DuplicatePrimaryKeyError from e except Exception as e: raise RecordCreationError from e diff --git a/component-test.Dockerfile b/component-test.Dockerfile index 9cfd4ec08..35dab45d4 100644 --- a/component-test.Dockerfile +++ b/component-test.Dockerfile @@ -9,7 +9,7 @@ RUN apt-get update \ swig=4.1.0-0.2 \ pkg-config=1.8.1-1 \ libxml2-dev=2.9.14+dfsg-1.3~deb12u5 \ - libxslt1-dev=1.1.35-1+deb12u3 \ + libxslt1-dev=1.1.35-1+deb12u4 \ python3-dev=3.11.2-1+b1 \ libffi-dev=3.4.4-1 \ && apt-get clean \ diff --git a/docker/inbound/Dockerfile b/docker/inbound/Dockerfile index 370691372..5211c9a4d 100644 --- a/docker/inbound/Dockerfile +++ b/docker/inbound/Dockerfile @@ -6,7 +6,7 @@ RUN apt-get update \ libssl-dev=3.0.19-1~deb12u2 \ libffi-dev=3.4.4-1 \ libxml2-dev=2.9.14+dfsg-1.3~deb12u5 \ - libxslt1-dev=1.1.35-1+deb12u3 \ + libxslt1-dev=1.1.35-1+deb12u4 \ pkg-config=1.8.1-1 \ python3-dev=3.11.2-1+b1 \ swig=4.1.0-0.2 \ diff --git a/docker/outbound/Dockerfile b/docker/outbound/Dockerfile index ae4c26f59..6eaf34519 100644 --- a/docker/outbound/Dockerfile +++ b/docker/outbound/Dockerfile @@ -7,7 +7,7 @@ RUN apt-get update \ swig=4.1.0-0.2 \ pkg-config=1.8.1-1 \ libxml2-dev=2.9.14+dfsg-1.3~deb12u5 \ - libxslt1-dev=1.1.35-1+deb12u3 \ + libxslt1-dev=1.1.35-1+deb12u4 \ python3-dev=3.11.2-1+b1 \ libffi-dev=3.4.4-1 \ && apt-get clean \ diff --git a/docker/spineroutelookup/Dockerfile b/docker/spineroutelookup/Dockerfile index 6c3c0d24f..4b47310e0 100644 --- a/docker/spineroutelookup/Dockerfile +++ b/docker/spineroutelookup/Dockerfile @@ -5,7 +5,7 @@ RUN apt-get update \ build-essential=12.9 \ libssl-dev=3.0.19-1~deb12u2 \ libxml2-dev=2.9.14+dfsg-1.3~deb12u5 \ - libxslt1-dev=1.1.35-1+deb12u3 \ + libxslt1-dev=1.1.35-1+deb12u4 \ libffi-dev=3.4.4-1 \ pkg-config=1.8.1-1 \ python3-dev=3.11.2-1+b1 \ diff --git a/integration-tests/integration_tests/integration_tests/component_tests/component_persistence_adaptor_tests.py b/integration-tests/integration_tests/integration_tests/component_tests/component_persistence_adaptor_tests.py index d1afbcfef..8dbf3cbee 100644 --- a/integration-tests/integration_tests/integration_tests/component_tests/component_persistence_adaptor_tests.py +++ b/integration-tests/integration_tests/integration_tests/component_tests/component_persistence_adaptor_tests.py @@ -89,7 +89,7 @@ async def test_can_CRUD(self): value = await adaptor.get(other_key) self.assertIsNone(value) - async def test_error_if_same_key_inserted_twice(self): + async def test_can_reinsert_same_key(self): for adaptor_type in PERSISTENCE_ADAPTOR_TYPES: with self.subTest(f"{adaptor_type}"): adaptor = self.get_adaptor(adaptor_type) @@ -98,14 +98,10 @@ async def test_error_if_same_key_inserted_twice(self): self.keys += [key] await adaptor.add(key, OTHER_DATA) + await adaptor.add(key, SAMPLE_DATA) - try: - await adaptor.add(key, OTHER_DATA) - except MaxRetriesExceeded as e: - cause = e.__cause__ - self.assertIsInstance(cause, DuplicatePrimaryKeyError) - else: - self.fail(f"Expected '{type(DuplicatePrimaryKeyError)}' exception not raised") + value = await adaptor.get(key) + self.assertEqual(value, SAMPLE_DATA) async def test_error_if_data_to_add_has_primary_key_in(self): await self._test_error_if_data_has_primary_key_in(PersistenceAdaptor.add.__name__)