diff options
author | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2022-01-27 17:16:45 +0100 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2022-01-27 17:32:20 +0100 |
commit | ac1d795cf1b55201c1aa7a495b3ff01b142c1830 (patch) | |
tree | f7840e32bf740380994f767b7a7707063bbae21f /container-disc | |
parent | 31555684b03f65a14e89e2e597b2505ff5291153 (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.java | 39 |
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, |