Skip to content

Commit ba0b016

Browse files
Stop health check executors during shutdown
1 parent d064584 commit ba0b016

File tree

2 files changed

+34
-15
lines changed

2 files changed

+34
-15
lines changed

multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/Messages.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,8 @@ public final class Messages {
215215
public static final String CHECKING_DATABASE_HEALTH = "Checking database health...";
216216
public static final String CHECKING_OBJECT_STORE_HEALTH = "Checking object store health...";
217217
public static final String CHECKING_FOR_INCREASED_LOCKS = "Checking for increased locks...";
218+
public static final String SHUTTING_DOWN_APPLICATION_HEALTH_CALCULATOR = "Shutting down application health calculator...";
219+
public static final String SKIPPING_HEALTH_STATUS_UPDATE_APPLICATION_IS_SHUTTING_DOWN = "Skipping health status update - application is shutting down";
218220

219221
// Audit log
220222

multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/application/health/ApplicationHealthCalculator.java

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,5 @@
11
package org.cloudfoundry.multiapps.controller.core.application.health;
22

3-
import java.text.MessageFormat;
4-
import java.time.Duration;
5-
import java.util.List;
6-
import java.util.concurrent.Callable;
7-
import java.util.concurrent.ExecutionException;
8-
import java.util.concurrent.ExecutorService;
9-
import java.util.concurrent.Executors;
10-
import java.util.concurrent.Future;
11-
import java.util.concurrent.ScheduledExecutorService;
12-
import java.util.concurrent.SynchronousQueue;
13-
import java.util.concurrent.ThreadPoolExecutor;
14-
import java.util.concurrent.TimeUnit;
15-
import java.util.concurrent.TimeoutException;
16-
import java.util.function.Consumer;
173
import jakarta.inject.Inject;
184
import jakarta.inject.Named;
195
import org.cloudfoundry.multiapps.common.SLException;
@@ -29,12 +15,28 @@
2915
import org.cloudfoundry.multiapps.controller.persistence.services.FileStorage;
3016
import org.slf4j.Logger;
3117
import org.slf4j.LoggerFactory;
18+
import org.springframework.beans.factory.DisposableBean;
3219
import org.springframework.beans.factory.annotation.Autowired;
3320
import org.springframework.http.HttpStatus;
3421
import org.springframework.http.ResponseEntity;
3522

23+
import java.text.MessageFormat;
24+
import java.time.Duration;
25+
import java.util.List;
26+
import java.util.concurrent.Callable;
27+
import java.util.concurrent.ExecutionException;
28+
import java.util.concurrent.ExecutorService;
29+
import java.util.concurrent.Executors;
30+
import java.util.concurrent.Future;
31+
import java.util.concurrent.ScheduledExecutorService;
32+
import java.util.concurrent.SynchronousQueue;
33+
import java.util.concurrent.ThreadPoolExecutor;
34+
import java.util.concurrent.TimeUnit;
35+
import java.util.concurrent.TimeoutException;
36+
import java.util.function.Consumer;
37+
3638
@Named
37-
public class ApplicationHealthCalculator {
39+
public class ApplicationHealthCalculator implements DisposableBean {
3840

3941
private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationHealthCalculator.class);
4042

@@ -69,6 +71,8 @@ public class ApplicationHealthCalculator {
6971

7072
private final ResilientOperationExecutor resilientOperationExecutor = getResilienceExecutor();
7173

74+
private volatile boolean isShuttingDown = false;
75+
7276
@Inject
7377
public ApplicationHealthCalculator(@Autowired(required = false) FileStorage objectStoreFileStorage,
7478
ApplicationConfiguration applicationConfiguration, DatabaseHealthService databaseHealthService,
@@ -85,6 +89,10 @@ protected void scheduleRegularHealthUpdate() {
8589
}
8690

8791
protected void updateHealthStatus() {
92+
if (isShuttingDown) {
93+
LOGGER.debug(Messages.SKIPPING_HEALTH_STATUS_UPDATE_APPLICATION_IS_SHUTTING_DOWN);
94+
return;
95+
}
8896
List<Callable<Boolean>> tasks = List.of(this::isObjectStoreFileStorageHealthy, this::isDatabaseHealthy,
8997
this::checkForIncreasedLocksWithTimeout);
9098
try {
@@ -232,4 +240,13 @@ protected ResilientOperationExecutor getResilienceExecutor() {
232240
return new ResilientOperationExecutor();
233241
}
234242

243+
@Override
244+
public void destroy() {
245+
LOGGER.info(Messages.SHUTTING_DOWN_APPLICATION_HEALTH_CALCULATOR);
246+
isShuttingDown = true;
247+
scheduler.shutdownNow();
248+
taskExecutor.shutdownNow();
249+
timeoutExecutor.shutdownNow();
250+
}
251+
235252
}

0 commit comments

Comments
 (0)