diff --git a/scm-it/pom.xml b/scm-it/pom.xml index 9064a39fc1..c38c73ce3e 100644 --- a/scm-it/pom.xml +++ b/scm-it/pom.xml @@ -200,10 +200,6 @@ java.awt.headless true - - sonia.scm.classloading.lifecycle - simple - /scm diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml index b71d4043c2..ba3805b094 100644 --- a/scm-webapp/pom.xml +++ b/scm-webapp/pom.xml @@ -734,10 +734,6 @@ scm.stage ${scm.stage} - - sonia.scm.classloading.lifecycle - simple - ${project.basedir}/src/main/conf/jetty.xml 0 @@ -823,10 +819,6 @@ scm.home target/scm-it - - sonia.scm.classloading.lifecycle - simple - ${project.basedir}/src/main/conf/jetty.xml 0 diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/InjectionContextRestartStrategy.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/InjectionContextRestartStrategy.java index e78e7b615c..a2ea3b7f9d 100644 --- a/scm-webapp/src/main/java/sonia/scm/lifecycle/InjectionContextRestartStrategy.java +++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/InjectionContextRestartStrategy.java @@ -11,6 +11,8 @@ import java.util.concurrent.atomic.AtomicLong; /** * Restart strategy which tries to free, every resource used by the context, starts gc and re initializes the context. + * Warning: This strategy should only be used with an classloader lifecycle which protects the + * created plugin classloader from classloader leaks. */ class InjectionContextRestartStrategy implements RestartStrategy { diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycle.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycle.java index fb7d991c1e..683dbc8fbb 100644 --- a/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycle.java +++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycle.java @@ -19,17 +19,17 @@ public abstract class ClassLoaderLifeCycle implements LifeCycle { private static final Logger LOG = LoggerFactory.getLogger(ClassLoaderLifeCycle.class); @VisibleForTesting - static final String PROPERTY = "sonia.scm.classloading.lifecycle"; + static final String PROPERTY = "sonia.scm.lifecycle.classloading"; public static ClassLoaderLifeCycle create() { ClassLoader webappClassLoader = Thread.currentThread().getContextClassLoader(); String implementation = System.getProperty(PROPERTY); - if (SimpleClassLoaderLifeCycle.NAME.equalsIgnoreCase(implementation)) { - LOG.info("create new simple ClassLoaderLifeCycle"); - return new SimpleClassLoaderLifeCycle(webappClassLoader); + if (ClassLoaderLifeCycleWithLeakPrevention.NAME.equalsIgnoreCase(implementation)) { + LOG.info("create new ClassLoaderLifeCycle with leak prevention"); + return new ClassLoaderLifeCycleWithLeakPrevention(webappClassLoader); } - LOG.info("create new ClassLoaderLifeCycle with leak prevention"); - return new ClassLoaderLifeCycleWithLeakPrevention(webappClassLoader); + LOG.info("create new simple ClassLoaderLifeCycle"); + return new SimpleClassLoaderLifeCycle(webappClassLoader); } private final ClassLoader webappClassLoader; diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleWithLeakPrevention.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleWithLeakPrevention.java index e2e7a032b7..471f4ebc9f 100644 --- a/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleWithLeakPrevention.java +++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleWithLeakPrevention.java @@ -26,6 +26,8 @@ import static se.jiderhamn.classloader.leak.prevention.cleanup.ShutdownHookClean */ final class ClassLoaderLifeCycleWithLeakPrevention extends ClassLoaderLifeCycle { + public static final String NAME = "with-leak-prevention"; + private static final Logger LOG = LoggerFactory.getLogger(ClassLoaderLifeCycleWithLeakPrevention.class); private Deque classLoaders = new ArrayDeque<>(); diff --git a/scm-webapp/src/test/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleTest.java b/scm-webapp/src/test/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleTest.java index 619b09940e..9ca3a765d1 100644 --- a/scm-webapp/src/test/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleTest.java +++ b/scm-webapp/src/test/java/sonia/scm/lifecycle/classloading/ClassLoaderLifeCycleTest.java @@ -17,9 +17,20 @@ class ClassLoaderLifeCycleTest { } } + @Test + void shouldCreateWithLeakPreventionClassLoader() { + System.setProperty(ClassLoaderLifeCycle.PROPERTY, ClassLoaderLifeCycleWithLeakPrevention.NAME); + try { + ClassLoaderLifeCycle classLoaderLifeCycle = ClassLoaderLifeCycle.create(); + assertThat(classLoaderLifeCycle).isInstanceOf(ClassLoaderLifeCycleWithLeakPrevention.class); + } finally { + System.clearProperty(ClassLoaderLifeCycle.PROPERTY); + } + } + @Test void shouldCreateDefaultClassLoader() { ClassLoaderLifeCycle classLoaderLifeCycle = ClassLoaderLifeCycle.create(); - assertThat(classLoaderLifeCycle).isInstanceOf(ClassLoaderLifeCycleWithLeakPrevention.class); + assertThat(classLoaderLifeCycle).isInstanceOf(SimpleClassLoaderLifeCycle.class); } }