summaryrefslogtreecommitdiffstats
path: root/container-disc
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2022-01-27 17:16:45 +0100
committerBjørn Christian Seime <bjorncs@verizonmedia.com>2022-01-27 17:32:20 +0100
commitac1d795cf1b55201c1aa7a495b3ff01b142c1830 (patch)
treef7840e32bf740380994f767b7a7707063bbae21f /container-disc
parent31555684b03f65a14e89e2e597b2505ff5291153 (diff)
Move final destruction to destroy() and add prepareStop()
Diffstat (limited to 'container-disc')
-rw-r--r--container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java39
1 files changed, 24 insertions, 15 deletions
diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java b/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java
index 8d25c9e0694..f370c2f9a2f 100644
--- a/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java
+++ b/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java
@@ -45,6 +45,7 @@ import com.yahoo.vespa.config.ConfigKey;
import com.yahoo.yolean.Exceptions;
import com.yahoo.yolean.UncheckedInterruptedException;
+import java.time.Duration;
import java.util.Collection;
import java.util.Collections;
import java.util.IdentityHashMap;
@@ -380,34 +381,37 @@ public final class ConfiguredApplication implements Application {
@Override
public void stop() {
shutdownDeadline.schedule((long)(shutdownTimeoutS.get() * 1000), dumpHeapOnShutdownTimeout.get());
+ stopServersAndAwaitTermination("Stop");
+ }
+
+ private void prepareStop(Duration timeout) {
+ ShutdownDeadline deadline =
+ new ShutdownDeadline(configId).schedule(timeout.toMillis(), dumpHeapOnShutdownTimeout.get());
+ stopServersAndAwaitTermination("PrepareStop");
+ deadline.cancel();
+ }
+
+ private void stopServersAndAwaitTermination(String logPrefix) {
shutdownReconfigurerThread();
- log.info("Stop: Closing servers");
+ log.info(logPrefix + ": Closing servers");
startAndStopServers(List.of());
startAndRemoveClients(List.of());
-
- log.info("Stop: Shutting container down");
- activateContainer(null, () -> {
- configurer.shutdown();
- slobrokConfigSubscriber.ifPresent(SlobrokConfigSubscriber::shutdown);
- Container.get().shutdown();
- unregisterInSlobrok();
- LogSetup.cleanup();
- log.info("Stop: Finished");
- });
+ log.info(logPrefix + ": Waiting for all in-flight requests to complete");
+ activateContainer(null, () -> configurer.shutdown());
nonTerminatedContainerTracker.arriveAndAwaitAdvance();
+ log.info(logPrefix + ": Finished");
}
// TODO Do more graceful shutdown of reconfigurer thread. The interrupt may leave the container in state where
// graceful shutdown is impossible or may hang.
private void shutdownReconfigurerThread() {
- if (reconfigurerThread == null) return;
- reconfigurerThread.interrupt();
try {
//Workaround for component constructors masking InterruptedException.
- while (reconfigurerThread.isAlive()) {
+ while (reconfigurerThread != null && reconfigurerThread.isAlive()) {
reconfigurerThread.interrupt();
long millis = 200;
reconfigurerThread.join(millis);
+ reconfigurerThread = null;
}
} catch (InterruptedException e) {
log.info("Interrupted while joining on HandlersConfigurer reconfigure thread.");
@@ -417,8 +421,13 @@ public final class ConfiguredApplication implements Application {
@Override
public void destroy() {
+ log.info("Destroy: Shutting down container now");
+ slobrokConfigSubscriber.ifPresent(SlobrokConfigSubscriber::shutdown);
+ Container.get().shutdown();
+ unregisterInSlobrok();
+ LogSetup.cleanup();
shutdownDeadline.cancel();
- log.info("Destroy: completed");
+ log.info("Destroy: Finished");
}
private static void addHandlerBindings(ContainerBuilder builder,