From 8dec14fbeaf331b9dfcd98d8ffffcc0f5cc48c6f Mon Sep 17 00:00:00 2001 From: jarebudev <23311805+jarebudev@users.noreply.github.com> Date: Sat, 6 Apr 2024 12:47:42 +0100 Subject: [PATCH] fix: shutdown method blocks until task executor shutdown completes (#873) * shutdown method blocks until task executor shutdown completes Signed-off-by: jarebudev <23311805+jarebudev@users.noreply.github.com> * addressed sonar issue with not handling interrupt during waiting Signed-off-by: jarebudev <23311805+jarebudev@users.noreply.github.com> --------- Signed-off-by: jarebudev <23311805+jarebudev@users.noreply.github.com> Co-authored-by: Michael Beemer Co-authored-by: Todd Baert --- .../java/dev/openfeature/sdk/EventSupport.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/openfeature/sdk/EventSupport.java b/src/main/java/dev/openfeature/sdk/EventSupport.java index f9bb67dd..49156b1a 100644 --- a/src/main/java/dev/openfeature/sdk/EventSupport.java +++ b/src/main/java/dev/openfeature/sdk/EventSupport.java @@ -12,6 +12,7 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; import java.util.function.Consumer; /** @@ -23,6 +24,7 @@ class EventSupport { // we use a v4 uuid as a "placeholder" for anonymous clients, since // ConcurrentHashMap doesn't support nulls private static final String defaultClientUuid = UUID.randomUUID().toString(); + private static final int SHUTDOWN_TIMEOUT_SECONDS = 3; private final Map handlerStores = new ConcurrentHashMap<>(); private final HandlerStore globalHandlerStore = new HandlerStore(); private final ExecutorService taskExecutor = Executors.newCachedThreadPool(runnable -> { @@ -146,13 +148,19 @@ class EventSupport { } /** - * Stop the event handler task executor. + * Stop the event handler task executor and block until either termination has completed + * or timeout period has elapsed. */ public void shutdown() { + taskExecutor.shutdown(); try { - taskExecutor.shutdown(); - } catch (Exception e) { - log.warn("Exception while attempting to shutdown task executor", e); + if (!taskExecutor.awaitTermination(SHUTDOWN_TIMEOUT_SECONDS, TimeUnit.SECONDS)) { + log.warn("Task executor did not terminate before the timeout period had elapsed"); + taskExecutor.shutdownNow(); + } + } catch (InterruptedException e) { + taskExecutor.shutdownNow(); + Thread.currentThread().interrupt(); } }