From f1c29352867c4277a3267fa23de81fc68584f5c7 Mon Sep 17 00:00:00 2001 From: Alexandre Chakroun Date: Thu, 8 Jan 2026 14:23:42 +0100 Subject: [PATCH 1/3] Properly shutdown multiprovider initialization thread pool Signed-off-by: Alexandre Chakroun --- .../providers/multiprovider/MultiProvider.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/providers/multiprovider/src/main/java/dev/openfeature/contrib/providers/multiprovider/MultiProvider.java b/providers/multiprovider/src/main/java/dev/openfeature/contrib/providers/multiprovider/MultiProvider.java index 2aefe62af..da3298796 100644 --- a/providers/multiprovider/src/main/java/dev/openfeature/contrib/providers/multiprovider/MultiProvider.java +++ b/providers/multiprovider/src/main/java/dev/openfeature/contrib/providers/multiprovider/MultiProvider.java @@ -90,7 +90,7 @@ public void initialize(EvaluationContext evaluationContext) throws Exception { json.put("name", NAME); JSONObject providersMetadata = new JSONObject(); json.put("originalMetadata", providersMetadata); - ExecutorService initPool = Executors.newFixedThreadPool(INIT_THREADS_COUNT); + Collection> tasks = new ArrayList<>(providers.size()); for (FeatureProvider provider : providers.values()) { tasks.add(() -> { @@ -101,12 +101,19 @@ public void initialize(EvaluationContext evaluationContext) throws Exception { providerMetadata.put("name", provider.getMetadata().getName()); providersMetadata.put(provider.getMetadata().getName(), providerMetadata); } - List> results = initPool.invokeAll(tasks); - for (Future result : results) { - if (!result.get()) { - throw new GeneralError("init failed"); + + ExecutorService initPool = Executors.newFixedThreadPool(INIT_THREADS_COUNT); + try { + List> results = initPool.invokeAll(tasks); + for (Future result : results) { + if (!result.get()) { + throw new GeneralError("init failed"); + } } + } finally { + initPool.shutdown(); } + metadataName = json.toString(); } From e9b44e1da22923478c60f41b6bcd6744a3b59ed4 Mon Sep 17 00:00:00 2001 From: Alexandre Chakroun Date: Thu, 8 Jan 2026 14:36:12 +0100 Subject: [PATCH 2/3] Address AI review comment Signed-off-by: Alexandre Chakroun --- .../contrib/providers/multiprovider/MultiProvider.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/providers/multiprovider/src/main/java/dev/openfeature/contrib/providers/multiprovider/MultiProvider.java b/providers/multiprovider/src/main/java/dev/openfeature/contrib/providers/multiprovider/MultiProvider.java index da3298796..b44d79dd9 100644 --- a/providers/multiprovider/src/main/java/dev/openfeature/contrib/providers/multiprovider/MultiProvider.java +++ b/providers/multiprovider/src/main/java/dev/openfeature/contrib/providers/multiprovider/MultiProvider.java @@ -105,10 +105,10 @@ public void initialize(EvaluationContext evaluationContext) throws Exception { ExecutorService initPool = Executors.newFixedThreadPool(INIT_THREADS_COUNT); try { List> results = initPool.invokeAll(tasks); + // Wait for all provider initializations to complete. + // If any provider.initialize() throws, result.get() will throw ExecutionException. for (Future result : results) { - if (!result.get()) { - throw new GeneralError("init failed"); - } + result.get(); } } finally { initPool.shutdown(); From 98aee38d300affb473148685cf0632c4f9a22a93 Mon Sep 17 00:00:00 2001 From: Alexandre Chakroun Date: Thu, 8 Jan 2026 15:00:16 +0100 Subject: [PATCH 3/3] spotless Signed-off-by: Alexandre Chakroun --- .../contrib/providers/multiprovider/MultiProvider.java | 1 - 1 file changed, 1 deletion(-) diff --git a/providers/multiprovider/src/main/java/dev/openfeature/contrib/providers/multiprovider/MultiProvider.java b/providers/multiprovider/src/main/java/dev/openfeature/contrib/providers/multiprovider/MultiProvider.java index b44d79dd9..9460115ba 100644 --- a/providers/multiprovider/src/main/java/dev/openfeature/contrib/providers/multiprovider/MultiProvider.java +++ b/providers/multiprovider/src/main/java/dev/openfeature/contrib/providers/multiprovider/MultiProvider.java @@ -6,7 +6,6 @@ import dev.openfeature.sdk.Metadata; import dev.openfeature.sdk.ProviderEvaluation; import dev.openfeature.sdk.Value; -import dev.openfeature.sdk.exceptions.GeneralError; import java.util.ArrayList; import java.util.Collection; import java.util.Collections;