From 72e532b8d5abdab2a9be3e56e133a7fbc0b34147 Mon Sep 17 00:00:00 2001 From: MartinWheelerMT Date: Tue, 11 Aug 2026 09:29:16 +0100 Subject: [PATCH] NIAD-5467 - Clinical information missing from bundle * Add 'syncronized' to COPC Message handler, due to race condition when attemping to e merge and uncompress large EHR Extract. * Update changelog. --- CHANGELOG.md | 3 +++ .../adaptors/pss/translator/task/COPCMessageHandler.java | 9 +++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b59962506..90311134d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Fixed * Fixed spelling error in measurement unit "milliliter". +* Add thread-safe synchronisation when merging and uncompressing a large EHR Extract bundle to avoid a race condition + occurring where multiple threads may attempt to merge and uncompress the same EHR Extract bundle at the same time. + This could result in a corrupted EHR Extract bundle. ## [3.3.1] - 2026-06-01 diff --git a/gp2gp-translator/src/main/java/uk/nhs/adaptors/pss/translator/task/COPCMessageHandler.java b/gp2gp-translator/src/main/java/uk/nhs/adaptors/pss/translator/task/COPCMessageHandler.java index f445495ec..6667a331f 100644 --- a/gp2gp-translator/src/main/java/uk/nhs/adaptors/pss/translator/task/COPCMessageHandler.java +++ b/gp2gp-translator/src/main/java/uk/nhs/adaptors/pss/translator/task/COPCMessageHandler.java @@ -128,11 +128,12 @@ public void handleMessage(InboundMessage inboundMessage, String conversationId) checkAndMergeFileParts(inboundMessage, conversationId); nackAckPreparationService.sendAckMessage(payload, conversationId, migrationRequest.getLosingPracticeOdsCode()); - // merge and uncompress large EHR message - if (inboundMessageMergingService.canMergeCompleteBundle(conversationId)) { - inboundMessageMergingService.mergeAndBundleMessage(conversationId); + synchronized (this) { + // merge and uncompress large EHR message + if (inboundMessageMergingService.canMergeCompleteBundle(conversationId)) { + inboundMessageMergingService.mergeAndBundleMessage(conversationId); + } } - } catch (WebClientRequestException | ConnectionException | MhsServerErrorException e) { throw e; } catch (ParseException | ValidationException | SAXException e) {