From b799daef72e38363d35a2c1acada6c44de3e83a3 Mon Sep 17 00:00:00 2001 From: Amichai Rothman Date: Sat, 30 May 2026 12:04:18 +0300 Subject: [PATCH] ARIES-2230 Fix Race condition in TopologyManagerImpor handling of endpoint events --- .../importer/TopologyManagerImport.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/importer/TopologyManagerImport.java b/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/importer/TopologyManagerImport.java index fa7c1d784..42b6523f3 100644 --- a/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/importer/TopologyManagerImport.java +++ b/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/importer/TopologyManagerImport.java @@ -21,6 +21,7 @@ import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -110,9 +111,12 @@ public void remove(RemoteServiceAdmin rsa) { public void remoteAdminEvent(RemoteServiceAdminEvent event) { ImportReference ref = event.getImportReference(); if (event.getType() == RemoteServiceAdminEvent.IMPORT_UNREGISTRATION && ref != null) { - importedServices.allValues().stream() - .filter(reg -> ref.equals(reg.getImportReference())) - .forEach(this::unimportRegistration); + synchronized (this) { + List closing = importedServices.allValues().stream() + .filter(reg -> ref.equals(reg.getImportReference())) + .collect(Collectors.toList()); // make a copy to prevent CME + closing.forEach(this::unimportRegistration); + } } } @@ -133,7 +137,7 @@ private void synchronizeImportsAsync(final String filter) { * * @param filter the filter whose endpoints are synchronized */ - private void synchronizeImports(final String filter) { + private synchronized void synchronizeImports(final String filter) { try { // we have a set of all current imports, and a set of all possible imports (with overlap) Set imported = importedServices.get(filter);