From 1e33d1de36b9d07237da7ebf7543991b65cc876b Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Thu, 20 May 2021 21:06:43 +0200 Subject: [PATCH] feat: add possibility to configure termination timeout Fixes #421 --- README.md | 1 + .../api/config/ConfigurationService.java | 12 ++++++++++ .../processing/DefaultEventHandler.java | 22 +++++++++++++++++-- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fa4b791bb2..4e153f881a 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,7 @@ on [event sources](https://csviri.medium.com/java-operator-sdk-introduction-to-e - Updated Fabric8 client to version 5.4.0 - It is now possible to configure the controllers to not automatically add finalizers to resources. See the `Controller` annotation documentation for more details. +- Added the possibility to configure how many seconds the SDK will wait before terminating reconciliation threads when a shut down is requested #### Overview of the 1.8.0 changes diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java index f1e6325f1c..4862889e60 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java @@ -79,4 +79,16 @@ default int concurrentReconciliationThreads() { default ObjectMapper getObjectMapper() { return new ObjectMapper(); } + + int DEFAULT_TERMINATION_TIMEOUT_SECONDS = 10; + + /** + * Retrieves the number of seconds the SDK waits for reconciliation threads to terminate before + * shutting down. + * + * @return the number of seconds to wait before terminating reconciliation threads + */ + default int getTerminationTimeoutSeconds() { + return DEFAULT_TERMINATION_TIMEOUT_SECONDS; + } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/DefaultEventHandler.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/DefaultEventHandler.java index 41316505d3..3257ea5707 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/DefaultEventHandler.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/DefaultEventHandler.java @@ -8,6 +8,7 @@ import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.javaoperatorsdk.operator.api.ResourceController; import io.javaoperatorsdk.operator.api.RetryInfo; +import io.javaoperatorsdk.operator.api.config.ConfigurationService; import io.javaoperatorsdk.operator.api.config.ControllerConfiguration; import io.javaoperatorsdk.operator.processing.event.DefaultEventSourceManager; import io.javaoperatorsdk.operator.processing.event.Event; @@ -41,6 +42,7 @@ public class DefaultEventHandler implements EventHandler { private final Retry retry; private final Map retryState = new HashMap<>(); private final String controllerName; + private final int terminationTimeout; private DefaultEventSourceManager eventSourceManager; private final ReentrantLock lock = new ReentrantLock(); @@ -51,7 +53,8 @@ public DefaultEventHandler( new EventDispatcher(controller, configuration, client), configuration.getName(), GenericRetry.fromConfiguration(configuration.getRetryConfiguration()), - configuration.getConfigurationService().concurrentReconciliationThreads()); + configuration.getConfigurationService().concurrentReconciliationThreads(), + configuration.getConfigurationService().getTerminationTimeoutSeconds()); } DefaultEventHandler( @@ -59,10 +62,25 @@ public DefaultEventHandler( String relatedControllerName, Retry retry, int concurrentReconciliationThreads) { + this( + eventDispatcher, + relatedControllerName, + retry, + concurrentReconciliationThreads, + ConfigurationService.DEFAULT_TERMINATION_TIMEOUT_SECONDS); + } + + private DefaultEventHandler( + EventDispatcher eventDispatcher, + String relatedControllerName, + Retry retry, + int concurrentReconciliationThreads, + int terminationTimeout) { this.eventDispatcher = eventDispatcher; this.retry = retry; this.controllerName = relatedControllerName; eventBuffer = new EventBuffer(); + this.terminationTimeout = terminationTimeout; executor = new ScheduledThreadPoolExecutor( concurrentReconciliationThreads, @@ -73,7 +91,7 @@ public DefaultEventHandler( public void close() { try { log.debug("Closing handler for {}", controllerName); - executor.awaitTermination(10, TimeUnit.SECONDS); + executor.awaitTermination(terminationTimeout, TimeUnit.SECONDS); } catch (InterruptedException e) { log.debug("Exception closing handler for {}: {}", controllerName, e.getLocalizedMessage()); }