diff options
author | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2022-01-26 16:50:22 +0100 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2022-01-27 10:39:03 +0100 |
commit | 3fbe018fec86eb52cdb09670b0de064846076e82 (patch) | |
tree | 337da35d5a21ec7737cfe6e8ee4dde193029375d | |
parent | 67eb29473e277f49a1e2a64555f33653432c8e29 (diff) |
Wait for all previous container to terminate
-rw-r--r-- | container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java | 45 |
1 files changed, 26 insertions, 19 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 1d50686680d..570277ae62b 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 @@ -53,7 +53,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.WeakHashMap; -import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Phaser; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; @@ -91,6 +91,7 @@ public final class ConfiguredApplication implements Application { new ComponentRegistry<>(), new ComponentRegistry<>()); private final OsgiFramework restrictedOsgiFramework; + private final Phaser nonTerminatedContainerTracker = new Phaser(1); private HandlersConfigurerDi configurer; private Thread reconfigurerThread; private Thread portWatcher; @@ -252,8 +253,7 @@ public final class ConfiguredApplication implements Application { configurer.getComponent(ApplicationContext.class).discBindingsConfig); installServerProviders(builder); - DeactivatedContainer deactivated = activator.activateContainer(builder); - if (deactivated != null) deactivated.notifyTermination(cleanupTask); + activateContainer(builder, cleanupTask); startClients(); startAndStopServers(); @@ -263,6 +263,20 @@ public final class ConfiguredApplication implements Application { metric.set("application_generation", configurer.generation(), metric.createContext(Map.of())); } + private void activateContainer(ContainerBuilder builder, Runnable onPreviousContainerTermination) { + DeactivatedContainer deactivated = activator.activateContainer(builder); + if (deactivated != null) { + nonTerminatedContainerTracker.register(); + deactivated.notifyTermination(() -> { + try { + onPreviousContainerTermination.run(); + } finally { + nonTerminatedContainerTracker.arriveAndDeregister(); + } + }); + } + } + private ContainerBuilder createBuilderWithGuiceBindings() { ContainerBuilder builder = activator.newContainerBuilder(); setupGuiceBindings(builder.guiceModules()); @@ -377,22 +391,15 @@ public final class ConfiguredApplication implements Application { } log.info("Stop: Shutting container down"); - CountDownLatch latch = new CountDownLatch(1); - activator.activateContainer(null) - .notifyTermination(() -> { - configurer.shutdown(); - slobrokConfigSubscriber.ifPresent(SlobrokConfigSubscriber::shutdown); - Container.get().shutdown(); - unregisterInSlobrok(); - LogSetup.cleanup(); - log.info("Stop: Finished"); - latch.countDown(); - }); - try { - latch.await(); - } catch (InterruptedException e) { - throw new UncheckedInterruptedException("Failed to wait for container deactivation to complete", e, true); - } + activateContainer(null, () -> { + configurer.shutdown(); + slobrokConfigSubscriber.ifPresent(SlobrokConfigSubscriber::shutdown); + Container.get().shutdown(); + unregisterInSlobrok(); + LogSetup.cleanup(); + log.info("Stop: Finished"); + }); + nonTerminatedContainerTracker.arriveAndAwaitAdvance(); } private void shutdownReconfigurerThread() { |