diff options
-rw-r--r-- | container-disc/src/main/java/com/yahoo/container/jdisc/component/Deconstructor.java | 2 | ||||
-rw-r--r-- | container-disc/src/test/java/com/yahoo/container/jdisc/component/DeconstructorTest.java | 26 |
2 files changed, 23 insertions, 5 deletions
diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/component/Deconstructor.java b/container-disc/src/main/java/com/yahoo/container/jdisc/component/Deconstructor.java index 3a153ec3d8a..6a46e331762 100644 --- a/container-disc/src/main/java/com/yahoo/container/jdisc/component/Deconstructor.java +++ b/container-disc/src/main/java/com/yahoo/container/jdisc/component/Deconstructor.java @@ -61,7 +61,7 @@ public class Deconstructor implements ComponentDeconstructor { ((SharedResource) component).release(); } } - if (! destructibleComponents.isEmpty()) + if (! destructibleComponents.isEmpty() || ! bundles.isEmpty()) executor.schedule(new DestructComponentTask(destructibleComponents, bundles), delay.getSeconds(), TimeUnit.SECONDS); } diff --git a/container-disc/src/test/java/com/yahoo/container/jdisc/component/DeconstructorTest.java b/container-disc/src/test/java/com/yahoo/container/jdisc/component/DeconstructorTest.java index 345f75f7eb6..efdc8f44c17 100644 --- a/container-disc/src/test/java/com/yahoo/container/jdisc/component/DeconstructorTest.java +++ b/container-disc/src/test/java/com/yahoo/container/jdisc/component/DeconstructorTest.java @@ -2,14 +2,13 @@ package com.yahoo.container.jdisc.component; import com.yahoo.component.AbstractComponent; +import com.yahoo.container.bundle.MockBundle; import com.yahoo.container.di.componentgraph.Provider; import com.yahoo.jdisc.ResourceReference; import com.yahoo.jdisc.SharedResource; import org.junit.Before; import org.junit.Test; -import java.util.Collections; - import static java.util.Collections.emptyList; import static java.util.Collections.singleton; import static org.junit.Assert.assertTrue; @@ -51,22 +50,41 @@ public class DeconstructorTest { assertTrue(sharedResource.released); } + @Test + public void bundles_are_uninstalled() throws InterruptedException { + var bundle = new UninstallableMockBundle(); + // Done by executor, so it takes some time even with a 0 delay. + deconstructor.deconstruct(emptyList(), singleton(bundle)); + int cnt = 0; + while (! bundle.uninstalled && (cnt++ < 12000)) { + Thread.sleep(10); + } + assertTrue(bundle.uninstalled); + } + private static class TestAbstractComponent extends AbstractComponent { boolean destructed = false; @Override public void deconstruct() { destructed = true; } } private static class TestProvider implements Provider<Void> { - boolean destructed = false; + volatile boolean destructed = false; @Override public Void get() { return null; } @Override public void deconstruct() { destructed = true; } } private static class TestSharedResource implements SharedResource { - boolean released = false; + volatile boolean released = false; @Override public ResourceReference refer() { return null; } @Override public void release() { released = true; } } + + private static class UninstallableMockBundle extends MockBundle { + boolean uninstalled = false; + @Override public void uninstall() { + uninstalled = true; + } + } } |