Repository: brooklyn-server Updated Branches: refs/heads/master b7f13c147 -> aae721865
allow reuse of embedded osgi framework (speed up tests and reduce memory) primary change is in OsgiManager, to leave frameworks running build times including test reduced from 17m to 11m on my box, saving 6m in CAMP (from 7m to 1m)! have done some assertions that starting a framework takes 200ms each time, plus it leaks a couple MB, so it's a bad idea to bake this in to our unit tests. (see comments in new OsgiTestingLeaksAndSpeedTest for full details.) have also "confirmed" that reusing a running framework has no adverse impact, after we remove bundles that a test installs (all tests pass in reusable mode except a few which asserted the cache dir is deleted (as it no longer is) and these still pass in non-reusable mode) Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/881ecd56 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/881ecd56 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/881ecd56 Branch: refs/heads/master Commit: 881ecd5641f8710924edb21f48b7c9a0fddf3f3a Parents: cbc9b73 Author: Alex Heneveld <[email protected]> Authored: Tue Apr 25 13:24:02 2017 +0100 Committer: Alex Heneveld <[email protected]> Committed: Fri Apr 28 11:46:41 2017 +0100 ---------------------------------------------------------------------- .../camp/brooklyn/AbstractYamlTest.java | 8 +- .../camp/brooklyn/ExternalConfigYamlTest.java | 2 +- ...RmMachineLocationExternalConfigYamlTest.java | 2 +- .../catalog/AbstractCatalogXmlTest.java | 2 +- .../catalog/CatalogMakeOsgiBundleTest.java | 2 +- .../brooklyn/core/mgmt/ha/OsgiManager.java | 87 ++++++++++++- .../brooklyn/core/BrooklynVersionTest.java | 2 +- ...aderFromBrooklynClassLoadingContextTest.java | 2 +- .../brooklyn/core/mgmt/osgi/OsgiPathTest.java | 12 +- .../mgmt/osgi/OsgiTestingLeaksAndSpeedTest.java | 125 +++++++++++++++++++ .../mgmt/osgi/OsgiVersionMoreEntityTest.java | 2 +- ...entoSerializerDelegatingClassLoaderTest.java | 2 +- .../mgmt/persist/XmlMementoSerializerTest.java | 14 +-- .../rebind/ActivePartialRebindVersionTest.java | 2 +- .../core/mgmt/rebind/ManagementPlaneIdTest.java | 2 +- .../core/mgmt/rebind/RebindTestFixture.java | 8 +- .../core/mgmt/rebind/RebindTestUtils.java | 19 ++- .../entity/LocalManagementContextForTests.java | 43 ++++++- .../util/core/ClassLoaderUtilsTest.java | 14 +-- .../util/core/osgi/BundleMakerTest.java | 2 +- .../rt/felix/EmbeddedFelixFramework.java | 2 +- 21 files changed, 312 insertions(+), 42 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java index 5581aba..c69f481 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractYamlTest.java @@ -90,7 +90,8 @@ public abstract class AbstractYamlTest { } protected LocalManagementContext newTestManagementContext() { - Builder builder = LocalManagementContextForTests.builder(true).disableOsgi(disableOsgi()); + Builder builder = LocalManagementContextForTests.builder(true). + setOsgiEnablementAndReuse(!disableOsgi(), !disallowOsgiReuse()); if (useDefaultProperties()) { builder.useDefaultProperties(); } @@ -101,6 +102,11 @@ public abstract class AbstractYamlTest { protected boolean disableOsgi() { return true; } + + /** Override to disable OSGi reuse */ + protected boolean disallowOsgiReuse() { + return false; + } protected boolean useDefaultProperties() { return false; http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java index 2dd66e0..7b71840 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java @@ -91,7 +91,7 @@ public class ExternalConfigYamlTest extends AbstractYamlTest { return LocalManagementContextForTests.builder(true) .useProperties(props) - .disableOsgi(false) + .enableOsgiReusable() .build(); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WinRmMachineLocationExternalConfigYamlTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WinRmMachineLocationExternalConfigYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WinRmMachineLocationExternalConfigYamlTest.java index f5a2c01..681367d 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WinRmMachineLocationExternalConfigYamlTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WinRmMachineLocationExternalConfigYamlTest.java @@ -44,7 +44,7 @@ public class WinRmMachineLocationExternalConfigYamlTest extends AbstractYamlTest return LocalManagementContextForTests.builder(true) .useProperties(props) - .disableOsgi(false) + .enableOsgiReusable() .build(); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/AbstractCatalogXmlTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/AbstractCatalogXmlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/AbstractCatalogXmlTest.java index 7985bb8..f93a77d 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/AbstractCatalogXmlTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/AbstractCatalogXmlTest.java @@ -58,7 +58,7 @@ public class AbstractCatalogXmlTest extends AbstractYamlTest { properties.put(BrooklynServerConfig.BROOKLYN_CATALOG_URL, catalog.toURI().toString()); return LocalManagementContextForTests.builder(true) .useProperties(properties) - .disableOsgi(false) + .enableOsgiReusable() .build(); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogMakeOsgiBundleTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogMakeOsgiBundleTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogMakeOsgiBundleTest.java index c1030c1..6eca121 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogMakeOsgiBundleTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogMakeOsgiBundleTest.java @@ -70,7 +70,7 @@ public class CatalogMakeOsgiBundleTest extends AbstractYamlTest { @Override protected LocalManagementContext newTestManagementContext() { return LocalManagementContextForTests.builder(true) - .disableOsgi(false) + .enableOsgiReusable() .build(); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java index fbef947..6f6d230 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import org.apache.brooklyn.api.catalog.CatalogItem; @@ -41,6 +42,7 @@ import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.core.BrooklynFeatureEnablement; import org.apache.brooklyn.core.BrooklynVersion; import org.apache.brooklyn.core.catalog.internal.CatalogBundleLoader; +import org.apache.brooklyn.core.config.ConfigKeys; import org.apache.brooklyn.core.mgmt.persist.OsgiClassPrefixer; import org.apache.brooklyn.core.server.BrooklynServerConfig; import org.apache.brooklyn.core.server.BrooklynServerPaths; @@ -62,6 +64,7 @@ import org.apache.brooklyn.util.text.Strings; import org.apache.brooklyn.util.time.Duration; import org.osgi.framework.Bundle; import org.osgi.framework.BundleException; +import org.osgi.framework.Constants; import org.osgi.framework.launch.Framework; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -79,14 +82,28 @@ public class OsgiManager { private static final Logger log = LoggerFactory.getLogger(OsgiManager.class); public static final ConfigKey<Boolean> USE_OSGI = BrooklynServerConfig.USE_OSGI; + public static final ConfigKey<Boolean> REUSE_OSGI = ConfigKeys.newBooleanConfigKey("brooklyn.osgi.reuse", + "Whether the OSGi container can reuse a previous one and itself can be reused, defaulting to false, " + + "often overridden in tests for efficiency (and will ignore the cache dir)", false); - /* see Osgis for info on starting framework etc */ + /** The {@link Framework#start()} event is the most expensive one; in fact a restart seems to be _more_ expensive than + * a start from scratch; however if we leave it running, uninstalling any extra bundles, then tests are fast and don't leak. + * See OsgiTestingLeaksAndSpeedTest. */ + protected static final boolean REUSED_FRAMEWORKS_ARE_KEPT_RUNNING = true; + + /* see `Osgis` class for info on starting framework etc */ protected final ManagementContext mgmt; protected final OsgiClassPrefixer osgiClassPrefixer; protected Framework framework; + protected boolean reuseFramework; + private Set<Bundle> bundlesAtStartup; protected File osgiCacheDir; protected Map<String, ManagedBundle> managedBundles = MutableMap.of(); + protected AtomicInteger numberOfReusableFrameworksCreated = new AtomicInteger(); + + + protected static final List<Framework> OSGI_FRAMEWORK_CONTAINERS_FOR_REUSE = MutableList.of(); public OsgiManager(ManagementContext mgmt) { this.mgmt = mgmt; @@ -94,19 +111,81 @@ public class OsgiManager { } public void start() { + if (framework!=null) { + throw new IllegalStateException("OSGi framework already set in this management context"); + } + try { - osgiCacheDir = BrooklynServerPaths.getOsgiCacheDirCleanedIfNeeded(mgmt); + if (mgmt.getConfig().getConfig(REUSE_OSGI)) { + reuseFramework = true; + + synchronized (OSGI_FRAMEWORK_CONTAINERS_FOR_REUSE) { + if (!OSGI_FRAMEWORK_CONTAINERS_FOR_REUSE.isEmpty()) { + framework = OSGI_FRAMEWORK_CONTAINERS_FOR_REUSE.remove(0); + } + } + if (framework!=null) { + if (!REUSED_FRAMEWORKS_ARE_KEPT_RUNNING) { + // don't think we need to do 'init' +// framework.init(); + framework.start(); + } + + log.debug("Reusing OSGi framework container from "+framework.getBundleContext().getProperty(Constants.FRAMEWORK_STORAGE)+" for mgmt node "+mgmt.getManagementNodeId()); + + return; + } + osgiCacheDir = Os.newTempDir("brooklyn-osgi-reusable-container"); + Os.deleteOnExitRecursively(osgiCacheDir); + if (numberOfReusableFrameworksCreated.incrementAndGet()%10==0) { + log.warn("Possible leak of reusable OSGi containers ("+numberOfReusableFrameworksCreated+" total)"); + } + + } else { + osgiCacheDir = BrooklynServerPaths.getOsgiCacheDirCleanedIfNeeded(mgmt); + } // any extra OSGi startup args could go here framework = Osgis.getFramework(osgiCacheDir.getAbsolutePath(), false); + log.debug("OSGi framework container created in "+osgiCacheDir+" mgmt node "+mgmt.getManagementNodeId()+ + (reuseFramework ? "(reusable, "+numberOfReusableFrameworksCreated.get()+" total)" : "") ); + } catch (Exception e) { throw Exceptions.propagate(e); + } finally { + if (reuseFramework) { + bundlesAtStartup = MutableSet.copyOf(Arrays.asList(framework.getBundleContext().getBundles())); + } } } public void stop() { - Osgis.ungetFramework(framework); - if (BrooklynServerPaths.isOsgiCacheForCleaning(mgmt, osgiCacheDir)) { + if (reuseFramework) { + for (Bundle b: framework.getBundleContext().getBundles()) { + if (!bundlesAtStartup.contains(b)) { + try { + log.info("Uninstalling "+b+" from OSGi container in "+framework.getBundleContext().getProperty(Constants.FRAMEWORK_STORAGE)); + b.uninstall(); + } catch (BundleException e) { + Exceptions.propagateIfFatal(e); + log.warn("Unable to uninstall "+b+"; container in "+framework.getBundleContext().getProperty(Constants.FRAMEWORK_STORAGE)+" will not be reused: "+e, e); + reuseFramework = false; + break; + } + } + } + } + + if (!reuseFramework || !REUSED_FRAMEWORKS_ARE_KEPT_RUNNING) { + Osgis.ungetFramework(framework); + } + + if (reuseFramework) { + synchronized (OSGI_FRAMEWORK_CONTAINERS_FOR_REUSE) { + OSGI_FRAMEWORK_CONTAINERS_FOR_REUSE.add(framework); + } + + } else if (BrooklynServerPaths.isOsgiCacheForCleaning(mgmt, osgiCacheDir)) { // See exception reported in https://issues.apache.org/jira/browse/BROOKLYN-72 // We almost always fail to delete he OSGi temp directory due to a concurrent modification. // Therefore keep trying. http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/core/src/test/java/org/apache/brooklyn/core/BrooklynVersionTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/BrooklynVersionTest.java b/core/src/test/java/org/apache/brooklyn/core/BrooklynVersionTest.java index 87121bf..ccaca98 100644 --- a/core/src/test/java/org/apache/brooklyn/core/BrooklynVersionTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/BrooklynVersionTest.java @@ -95,7 +95,7 @@ public class BrooklynVersionTest { public void testGetFeatures() throws Exception { TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), OsgiTestResources.BROOKLYN_TEST_OSGI_ENTITIES_PATH); LocalManagementContext mgmt = LocalManagementContextForTests.builder(true) - .disableOsgi(false) + .enableOsgiReusable() .build(); String symName = "org.apache.brooklyn.test.resources.osgi.brooklyn-test-osgi-entities"; String version = "0.1.0"; http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/core/src/test/java/org/apache/brooklyn/core/mgmt/classloading/ClassLoaderFromBrooklynClassLoadingContextTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/classloading/ClassLoaderFromBrooklynClassLoadingContextTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/classloading/ClassLoaderFromBrooklynClassLoadingContextTest.java index 997ff5c..0eb8ba2 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/classloading/ClassLoaderFromBrooklynClassLoadingContextTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/classloading/ClassLoaderFromBrooklynClassLoadingContextTest.java @@ -38,7 +38,7 @@ public class ClassLoaderFromBrooklynClassLoadingContextTest { @BeforeMethod(alwaysRun=true) @SuppressWarnings("deprecation") public void setUp() throws Exception { - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); item = mgmt.getCatalog().addItem(BasicApplication.class); BrooklynClassLoadingContext clc = new OsgiBrooklynClassLoadingContext(mgmt, item.getCatalogItemId(), ImmutableList.<OsgiBundleWithUrl>of()); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiPathTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiPathTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiPathTest.java index 6e0a248..e85648c 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiPathTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiPathTest.java @@ -48,9 +48,9 @@ public class OsgiPathTest { if (mgmt!=null) Entities.destroyAll(mgmt); } - @Test(groups="Integration") // integration only because OSGi takes ~200ms + @Test(groups="Integration") // integration only because non-reusable OSGi takes ~200ms public void testOsgiPathDefault() { - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiNonReusable().build(); String path = BrooklynServerPaths.getOsgiCacheDir(mgmt).getAbsolutePath(); Assert.assertTrue(path.startsWith(BrooklynServerPaths.getMgmtBaseDir(mgmt)), path); Assert.assertTrue(path.contains(mgmt.getManagementNodeId()), path); @@ -58,12 +58,12 @@ public class OsgiPathTest { assertExistsThenIsCleaned(path); } - @Test(groups="Integration") // integration only because OSGi takes ~200ms + @Test(groups="Integration") // integration only because non-reusable OSGi takes ~200ms public void testOsgiPathCustom() { BrooklynProperties bp = BrooklynProperties.Factory.newEmpty(); String randomSeg = "osgi-test-"+Identifiers.makeRandomId(4); bp.put(BrooklynServerConfig.OSGI_CACHE_DIR, "${brooklyn.os.tmpdir}"+"/"+randomSeg+"/"+"${brooklyn.mgmt.node.id}"); - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).useProperties(bp).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiNonReusable().useProperties(bp).build(); String path = BrooklynServerPaths.getOsgiCacheDir(mgmt).getAbsolutePath(); Os.deleteOnExitRecursivelyAndEmptyParentsUpTo(new File(path), new File(Os.tmp()+"/"+randomSeg)); @@ -73,12 +73,12 @@ public class OsgiPathTest { assertExistsThenIsCleaned(path); } - @Test(groups="Integration") // integration only because OSGi takes ~200ms + @Test(groups="Integration") // integration only because non-reusable OSGi takes ~200ms public void testOsgiPathCustomWithoutNodeIdNotCleaned() { BrooklynProperties bp = BrooklynProperties.Factory.newEmpty(); String randomSeg = "osgi-test-"+Identifiers.makeRandomId(4); bp.put(BrooklynServerConfig.OSGI_CACHE_DIR, "${brooklyn.os.tmpdir}"+"/"+randomSeg+"/"+"sample"); - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).useProperties(bp).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiNonReusable().useProperties(bp).build(); String path = BrooklynServerPaths.getOsgiCacheDir(mgmt).getAbsolutePath(); Os.deleteOnExitRecursivelyAndEmptyParentsUpTo(new File(path), new File(Os.tmp()+"/"+randomSeg)); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiTestingLeaksAndSpeedTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiTestingLeaksAndSpeedTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiTestingLeaksAndSpeedTest.java new file mode 100644 index 0000000..27258f5 --- /dev/null +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiTestingLeaksAndSpeedTest.java @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.brooklyn.core.mgmt.osgi; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +import org.apache.brooklyn.core.entity.Entities; +import org.apache.brooklyn.core.mgmt.internal.BrooklynGarbageCollector; +import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; +import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests; +import org.apache.brooklyn.core.test.entity.TestApplication; +import org.apache.brooklyn.util.javalang.JavaClassNames; +import org.apache.brooklyn.util.javalang.MemoryUsageTracker; +import org.apache.brooklyn.util.osgi.OsgiTestResources; +import org.apache.brooklyn.util.text.ByteSizeStrings; +import org.apache.brooklyn.util.time.Duration; +import org.osgi.framework.BundleException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.Assert; +import org.testng.annotations.Test; + +import com.google.common.base.Stopwatch; + + +/** + * Tests that starting with the OSGi subsystem + * (a) does not leak memory (which should fix test failures in jenkins), and + * (b) is fast (or we can make it faster...) + */ +public class OsgiTestingLeaksAndSpeedTest implements OsgiTestResources { + + private static final Logger log = LoggerFactory.getLogger(OsgiTestingLeaksAndSpeedTest.class); + + protected LocalManagementContext mgmt; + protected TestApplication app; + + void up() throws Exception { + mgmt = LocalManagementContextForTests.builder(true) + .enableOsgiReusable() +// .disableOsgi() +// .enableOsgiNonReusable() + .build(); + app = TestApplication.Factory.newManagedInstanceForTests(mgmt); + } + + void down() throws BundleException, IOException, InterruptedException { + Entities.destroyAll(mgmt); + } + + @Test(groups="Integration") + public void testUpDownManyTimes() throws Exception { + final int NUM_ITERS = 10; + // do a couple beforehand to eliminate one-off expenses + up(); down(); up(); down(); + forceGc(); + long memUsed0 = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); + Stopwatch sF = Stopwatch.createUnstarted(); + Stopwatch sG = Stopwatch.createStarted(); + for (int i=0; i<NUM_ITERS; i++) { + log.info(JavaClassNames.niceClassAndMethod()+" iteration "+i+": "+ + BrooklynGarbageCollector.makeBasicUsageString()); + sF.start(); + up(); + // confirmed this has no effect, even with OSGi + // Time.sleep(Duration.millis(200)); + down(); + sF.stop(); + forceGc(); + } + forceGc(); + sG.stop(); + long memUsed1 = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); + log.info(JavaClassNames.niceClassAndMethod()+" AFTER "+NUM_ITERS+": "+ + BrooklynGarbageCollector.makeBasicUsageString()); + long memLeakBytesPerIter = (memUsed1-memUsed0)/NUM_ITERS; + long upDownTimeMillisPerIter = sF.elapsed(TimeUnit.MILLISECONDS)/NUM_ITERS; + log.info(JavaClassNames.niceClassAndMethod()+" PER ITER (over "+NUM_ITERS+"): "+ + ByteSizeStrings.metric().makeSizeString( memLeakBytesPerIter )+", "+ + Duration.millis(upDownTimeMillisPerIter)+" per up+down, "+ + Duration.millis(sG.elapsed(TimeUnit.MILLISECONDS)/NUM_ITERS)+" per up+down+gc" + ); + + // with OSGi reusable (new) + // PER ITER (over 10): 1156 B, 23ms per up+down, 240ms per up+down+gc + // PER ITER (over 100): 727 B, 18ms per up+down, 249ms per up+down+gc + + // with OSGi non-reusable + // PER ITER (over 10): 3.60 MB, 276ms per up+down, 642ms per up+down+gc + // PER ITER (over 100): 1692 kB, 222ms per up+down, 988ms per up+down+gc + + // without OSGi + // PER ITER (over 10): 605 B, 24ms per up+down, 185ms per up+down+gc + // PER ITER (over 100): 747 B, 16ms per up+down, 184ms per up+down+gc + + Assert.assertTrue(memLeakBytesPerIter < 100*1000, "Leaked too much memory: "+memLeakBytesPerIter); + Assert.assertTrue(upDownTimeMillisPerIter < 200, "Took too long to startup: "+upDownTimeMillisPerIter); + + // can keep up to attach debugger +// Time.sleep(Duration.ONE_DAY); + } + + protected void forceGc() { + MemoryUsageTracker.forceClearSoftReferences(); + System.gc(); System.gc(); + } + +} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java index 059b83d..f19556e 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java @@ -77,7 +77,7 @@ public class OsgiVersionMoreEntityTest implements OsgiTestResources { @BeforeMethod(alwaysRun=true) public void setUp() throws Exception { - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); app = TestApplication.Factory.newManagedInstanceForTests(mgmt); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerDelegatingClassLoaderTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerDelegatingClassLoaderTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerDelegatingClassLoaderTest.java index 43b4404..38c9982 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerDelegatingClassLoaderTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerDelegatingClassLoaderTest.java @@ -48,7 +48,7 @@ public class XmlMementoSerializerDelegatingClassLoaderTest { @BeforeMethod(alwaysRun=true) public void setUp() throws Exception { - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); } @AfterMethod(alwaysRun=true) http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java index e8bc120..9b8ccae 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java @@ -376,7 +376,7 @@ public class XmlMementoSerializerTest { @Test public void testEntitySpecFromOsgi() throws Exception { TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_V1_PATH); - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); RegisteredType ci = OsgiVersionMoreEntityTest.addMoreEntityV1(mgmt, "1.0"); @@ -390,7 +390,7 @@ public class XmlMementoSerializerTest { @Test public void testOsgiBundleNameNotIncludedForWhiteListed() throws Exception { - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); serializer.setLookupContext(newEmptyLookupManagementContext(mgmt, true)); @@ -410,7 +410,7 @@ public class XmlMementoSerializerTest { String bundleUrl = OsgiStandaloneTest.BROOKLYN_TEST_OSGI_ENTITIES_URL; TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), bundlePath); - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); serializer.setLookupContext(newEmptyLookupManagementContext(mgmt, true)); Bundle bundle = installBundle(mgmt, bundleUrl); @@ -449,7 +449,7 @@ public class XmlMementoSerializerTest { String classname = OsgiTestResources.BROOKLYN_TEST_OSGI_ENTITIES_COM_EXAMPLE_OBJECT; TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), bundlePath); - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); Bundle bundle = installBundle(mgmt, bundleUrl); String bundlePrefix = bundle.getSymbolicName(); @@ -477,7 +477,7 @@ public class XmlMementoSerializerTest { String classname = OsgiTestResources.BROOKLYN_TEST_OSGI_ENTITIES_COM_EXAMPLE_OBJECT; TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), bundlePath); - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); Bundle bundle = installBundle(mgmt, bundleUrl); String oldBundlePrefix = "com.old.symbolicname"; @@ -509,7 +509,7 @@ public class XmlMementoSerializerTest { String oldClassname = "com.old.package.name.OldClassName"; TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), bundlePath); - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); Bundle bundle = installBundle(mgmt, bundleUrl); String bundlePrefix = bundle.getSymbolicName(); @@ -535,7 +535,7 @@ public class XmlMementoSerializerTest { // how we're using Felix? Would it also be true in Karaf? @Test(groups="Broken") public void testOsgiBundleNamePrefixIncludedForDownstreamDependency() throws Exception { - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); serializer.setLookupContext(newEmptyLookupManagementContext(mgmt, true)); // Using a guava type (which is a downstream dependency of Brooklyn) http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java index 6b1e43f..f18de9e 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java @@ -42,7 +42,7 @@ public class ActivePartialRebindVersionTest extends RebindTestFixtureWithApp { .persistPeriodMillis(getPersistPeriodMillis()) .forLive(useLiveManagementContext()) .emptyCatalog(useEmptyCatalog()) - .enableOsgi(true) + .enableOsgiReusable() .buildStarted(); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ManagementPlaneIdTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ManagementPlaneIdTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ManagementPlaneIdTest.java index 0fbadff..ea3ee5e 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ManagementPlaneIdTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ManagementPlaneIdTest.java @@ -215,7 +215,7 @@ public class ManagementPlaneIdTest { .enablePersistenceBackups(backedUp) .emptyCatalog(true) .properties(props) - .enableOsgi(false) + .setOsgiEnablementAndReuse(false, false) .buildStarted(); markForTermination(mgmt); return mgmt; http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java index 4c63cb1..614d630 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java @@ -108,7 +108,7 @@ public abstract class RebindTestFixture<T extends StartableApplication> { .enablePersistenceBackups(enablePersistenceBackups()) .emptyCatalog(useEmptyCatalog()) .properties(createBrooklynProperties()) - .enableOsgi(useOsgi()) + .setOsgiEnablementAndReuse(useOsgi(), !disallowOsgiReuse()) .buildStarted(); } @@ -141,7 +141,7 @@ public abstract class RebindTestFixture<T extends StartableApplication> { .haMode(haMode) .emptyCatalog(useEmptyCatalog()) .properties(brooklynProperties) - .enableOsgi(useOsgi()) + .setOsgiEnablementAndReuse(useOsgi(), !disallowOsgiReuse()) .buildUnstarted(); } @@ -208,6 +208,10 @@ public abstract class RebindTestFixture<T extends StartableApplication> { protected boolean useOsgi() { return false; } + + protected boolean disallowOsgiReuse() { + return false; + } protected int getPersistPeriodMillis() { return 1; http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java index 7271d3e..537ff8c 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java @@ -154,6 +154,7 @@ public class RebindTestUtils { HighAvailabilityMode haMode = HighAvailabilityMode.DISABLED; boolean forLive; boolean enableOsgi = false; + boolean reuseOsgi = true; boolean emptyCatalog; private boolean enablePersistenceBackups = true; @@ -192,11 +193,27 @@ public class RebindTestUtils { this.enablePersistenceBackups = val; return this; } + /** @deprecated since 0.12.0 use {@link #enableOsgiNonReusable()} or {@link #enableOsgiReusable()} */ + @Deprecated public ManagementContextBuilder enableOsgi(boolean val) { this.enableOsgi = val; return this; } + /** as {@link LocalManagementContextForTests.Builder#setOsgiEnablementAndReuse(boolean, boolean)} */ + public ManagementContextBuilder setOsgiEnablementAndReuse(boolean enableOsgi, boolean reuseOsgi) { + this.enableOsgi = enableOsgi; + this.reuseOsgi = reuseOsgi; + return this; + } + + public ManagementContextBuilder enableOsgiReusable() { + return setOsgiEnablementAndReuse(true, true); + } + public ManagementContextBuilder enableOsgiNonReusable() { + return setOsgiEnablementAndReuse(true, false); + } + public ManagementContextBuilder emptyCatalog() { this.emptyCatalog = true; return this; @@ -244,7 +261,7 @@ public class RebindTestUtils { } else { unstarted = LocalManagementContextForTests.builder(true) .useProperties(properties) - .disableOsgi(!enableOsgi) + .setOsgiEnablementAndReuse(enableOsgi, reuseOsgi) .disablePersistenceBackups(!enablePersistenceBackups) .build(); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/core/src/test/java/org/apache/brooklyn/core/test/entity/LocalManagementContextForTests.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/test/entity/LocalManagementContextForTests.java b/core/src/test/java/org/apache/brooklyn/core/test/entity/LocalManagementContextForTests.java index d89ccaf..9996294 100644 --- a/core/src/test/java/org/apache/brooklyn/core/test/entity/LocalManagementContextForTests.java +++ b/core/src/test/java/org/apache/brooklyn/core/test/entity/LocalManagementContextForTests.java @@ -22,6 +22,7 @@ import java.util.Map; import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.core.internal.BrooklynProperties; +import org.apache.brooklyn.core.mgmt.ha.OsgiManager; import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; import org.apache.brooklyn.core.server.BrooklynServerConfig; @@ -68,6 +69,12 @@ public class LocalManagementContextForTests extends LocalManagementContext { return brooklynProperties; } + public static BrooklynProperties reuseOsgi(BrooklynProperties brooklynProperties) { + if (brooklynProperties==null) return null; + setFailingIfConflicting(brooklynProperties, OsgiManager.REUSE_OSGI, true); + return brooklynProperties; + } + @SuppressWarnings("deprecation") public static BrooklynProperties disablePersistenceBackups(BrooklynProperties brooklynProperties) { if (brooklynProperties==null) return null; @@ -87,16 +94,46 @@ public class LocalManagementContextForTests extends LocalManagementContext { public static class Builder { boolean disablePersistenceBackups = false; boolean disableOsgi = false; + boolean reuseOsgi = false; boolean emptyCatalog = false; BrooklynProperties properties = null; Map<String, ?> additionalProperties = null; public Builder disablePersistenceBackups() { return disablePersistenceBackups(true); } - public Builder disableOsgi() { return disableOsgi(true); } + public Builder disableOsgi() { disableOsgi = true; return this; } public Builder emptyCatalog() { return emptyCatalog(true); } public Builder disablePersistenceBackups(boolean disablePersistenceBackups) { this.disablePersistenceBackups = disablePersistenceBackups; return this; } + + /** @deprecated since 0.12.0 use {@link #setOsgiEnablementAndReuse(boolean, boolean)} */ + @Deprecated public Builder disableOsgi(boolean disableOsgi) { this.disableOsgi = disableOsgi; return this; } + + /** sets the underlying fields more usually controlled by convenience methods + * {@link #disableOsgi()} or {@link #enableOsgiReusable()} or {@link #enableOsgiNonReusable()}; + * this method is available as a convenience for nested builders */ + public Builder setOsgiEnablementAndReuse(boolean enableOsgi, boolean reuseOsgi) { + this.disableOsgi = !enableOsgi; + this.reuseOsgi = reuseOsgi; + return this; + } + + /** enables OSGi and sets the flag that a container can be reused; + * this is the default if {@link #minimal()} is specdified and then OSGi enabled */ + public Builder enableOsgiReusable() { + disableOsgi = false; + reuseOsgi = true; + return this; + } + /** enables OSGi and forces a management context to use its own non-reusable OSGi container; + * this is the default in normal Brooklyn and the same behaviour is applied if minimal is not specified, + * but if minimal is specified this method must be used if a re-used OSGi container is required */ + public Builder enableOsgiNonReusable() { + disableOsgi = false; + reuseOsgi = false; + return this; + } + public Builder emptyCatalog(boolean emptyCatalog) { this.emptyCatalog = emptyCatalog; return this; } // for use in the outer class's constructor @@ -108,6 +145,7 @@ public class LocalManagementContextForTests extends LocalManagementContext { public Builder minimal() { disablePersistenceBackups(); disableOsgi(); + reuseOsgi = true; emptyCatalog(); properties = null; additionalProperties = null; @@ -137,6 +175,7 @@ public class LocalManagementContextForTests extends LocalManagementContext { if (additionalProperties != null) result.putAll(additionalProperties); if (disablePersistenceBackups) LocalManagementContextForTests.disablePersistenceBackups(result); if (disableOsgi) LocalManagementContextForTests.disableOsgi(result); + else if (reuseOsgi) LocalManagementContextForTests.reuseOsgi(result); if (emptyCatalog) LocalManagementContextForTests.setEmptyCatalogAsDefault(result); return result; } @@ -167,7 +206,7 @@ public class LocalManagementContextForTests extends LocalManagementContext { /** Creates a new minimal instance with OSGi then enabled. */ public static LocalManagementContext newInstanceWithOsgi() { - return builder(true).disableOsgi(false).build(); + return builder(true).enableOsgiReusable().build(); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java b/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java index ec8c63f..dfe942b 100644 --- a/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java +++ b/core/src/test/java/org/apache/brooklyn/util/core/ClassLoaderUtilsTest.java @@ -110,7 +110,7 @@ public class ClassLoaderUtilsTest { TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), bundlePath); - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); Bundle bundle = installBundle(mgmt, bundleUrl); @SuppressWarnings("unchecked") Class<? extends Entity> clazz = (Class<? extends Entity>) bundle.loadClass(classname); @@ -136,7 +136,7 @@ public class ClassLoaderUtilsTest { TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), bundlePath); - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); Bundle bundle = installBundle(mgmt, bundleUrl); Class<?> clazz = bundle.loadClass(classname); Entity entity = createSimpleEntity(bundleUrl, clazz); @@ -193,7 +193,7 @@ public class ClassLoaderUtilsTest { Class<?> clazz = BasicEntity.class; String classname = clazz.getName(); - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); Bundle bundle = getBundle(mgmt, "org.apache.brooklyn.core"); Entity entity = createSimpleEntity(bundle.getLocation(), clazz); @@ -213,7 +213,7 @@ public class ClassLoaderUtilsTest { Class<?> clazz = Entity.class; String classname = clazz.getName(); - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); Bundle bundle = getBundle(mgmt, "org.apache.brooklyn.api"); ClassLoaderUtils cluMgmt = new ClassLoaderUtils(getClass(), mgmt); @@ -228,7 +228,7 @@ public class ClassLoaderUtilsTest { @Test public void testIsBundleWhiteListed() throws Exception { - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); ClassLoaderUtils clu = new ClassLoaderUtils(getClass(), mgmt); assertTrue(clu.isBundleWhiteListed(getBundle(mgmt, "org.apache.brooklyn.core"))); @@ -242,7 +242,7 @@ public class ClassLoaderUtilsTest { */ @Test(groups={"Integration"}) public void testLoadsFromRightGuavaVersion() throws Exception { - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); ClassLoaderUtils clu = new ClassLoaderUtils(getClass(), mgmt); String bundleUrl = MavenRetriever.localUrl(MavenArtifact.fromCoordinate("com.google.guava:guava:jar:18.0")); @@ -255,7 +255,7 @@ public class ClassLoaderUtilsTest { @Test public void testLoadBrooklynClass() throws Exception { - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); new ClassLoaderUtils(this, mgmt).loadClass( "org.apache.brooklyn.api", BrooklynVersion.get(), http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/core/src/test/java/org/apache/brooklyn/util/core/osgi/BundleMakerTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/util/core/osgi/BundleMakerTest.java b/core/src/test/java/org/apache/brooklyn/util/core/osgi/BundleMakerTest.java index a23fab3..515ab2c 100644 --- a/core/src/test/java/org/apache/brooklyn/util/core/osgi/BundleMakerTest.java +++ b/core/src/test/java/org/apache/brooklyn/util/core/osgi/BundleMakerTest.java @@ -62,7 +62,7 @@ public class BundleMakerTest extends BrooklynMgmtUnitTestSupport { @BeforeMethod(alwaysRun=true) @Override public void setUp() throws Exception { - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); + mgmt = LocalManagementContextForTests.builder(true).enableOsgiReusable().build(); super.setUp(); bundleMaker = new BundleMaker(mgmt); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/881ecd56/utils/rt-felix/src/main/java/org/apache/brooklyn/rt/felix/EmbeddedFelixFramework.java ---------------------------------------------------------------------- diff --git a/utils/rt-felix/src/main/java/org/apache/brooklyn/rt/felix/EmbeddedFelixFramework.java b/utils/rt-felix/src/main/java/org/apache/brooklyn/rt/felix/EmbeddedFelixFramework.java index ed6b0a5..f815272 100644 --- a/utils/rt-felix/src/main/java/org/apache/brooklyn/rt/felix/EmbeddedFelixFramework.java +++ b/utils/rt-felix/src/main/java/org/apache/brooklyn/rt/felix/EmbeddedFelixFramework.java @@ -116,7 +116,7 @@ public class EmbeddedFelixFramework { return framework; } - public static void stopFramework(Framework framework) throws RuntimeException { + public static void stopFramework(Framework framework) throws RuntimeException { try { if (framework != null) { framework.stop();
