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) {