Uploaded image for project: 'Magnolia'
  1. Magnolia
  2. MAGNOLIA-8384

ThreadLocal leaking SystemRepositoryStrategy instances

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: Neutral Neutral
    • None
    • None
    • core

      Observed behaviour

      When shutting down Magnolia there is sometimes messages logged from Tomact about thread local leaks:

      26-Apr-2022 10:27:56.816 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [magnoliaPublic] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@3370f42]) and a value of type [info.magnolia.context.SystemRepositoryStrategy] (value [SystemRepositoryStrategy...
      

      Expected behaviour

      Thread locals are cleaned up before shutdown.

      Steps to reproduce

      I was able to reproduce this by running AssetsCoreFunctionalTests and then shutting down the instance.

      Initial analysis

      With the help of the debugging facility introduced with MAGNOLIA-8362 I was able to track down the stack traces of where those SystemRepositoryStrategy instances are being created:

      info.magnolia.context.SystemRepositoryStrategy.<init>(SystemRepositoryStrategy.java:64)
      sun.reflect.GeneratedConstructorAccessor580.newInstance(Unknown Source)
      sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
      java.lang.reflect.Constructor.newInstance(Constructor.java:423)
      info.magnolia.objectfactory.ObjectManufacturer.newInstance(ObjectManufacturer.java:129)
      info.magnolia.objectfactory.ObjectManufacturer.newInstance(ObjectManufacturer.java:99)
      info.magnolia.objectfactory.guice.GuiceComponentProvider.newInstanceWithParameterResolvers(GuiceComponentProvider.java:134)
      info.magnolia.objectfactory.guice.GuiceComponentProvider.newInstanceWithParameterResolvers(GuiceComponentProvider.java:120)
      info.magnolia.objectfactory.guice.GuiceComponentProvider.newInstance(GuiceComponentProvider.java:115)
      info.magnolia.objectfactory.Components.newInstance(Components.java:100)
      info.magnolia.context.JCRSessionPerThreadSystemContext.getRepositoryStrategy(JCRSessionPerThreadSystemContext.java:50)
      info.magnolia.context.AbstractContext.release(AbstractContext.java:308)
      info.magnolia.resourceloader.jcr.JcrResourceOrigin$ResourcesObservationListener.onEvent(JcrResourceOrigin.java:362)
      info.magnolia.cms.util.FilteredEventListener.onEvent(FilteredEventListener.java:86)
      info.magnolia.observation.DeferringEventListener$ObservationBasedDelayedExecutor$1.run(DeferringEventListener.java:102)
      info.magnolia.cms.util.DelayedExecutor$RunnableWrapper.run(DelayedExecutor.java:103)
      EDU.oswego.cs.dl.util.concurrent.ClockDaemon$RunLoop.run(Unknown Source)
      java.lang.Thread.run(Thread.java:748)
      

      and

      info.magnolia.context.SystemRepositoryStrategy.<init>(SystemRepositoryStrategy.java:64)
      sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
      sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
      java.lang.reflect.Constructor.newInstance(Constructor.java:423)
      info.magnolia.objectfactory.ObjectManufacturer.newInstance(ObjectManufacturer.java:129)
      info.magnolia.objectfactory.ObjectManufacturer.newInstance(ObjectManufacturer.java:99)
      info.magnolia.objectfactory.guice.GuiceComponentProvider.newInstanceWithParameterResolvers(GuiceComponentProvider.java:134)
      info.magnolia.objectfactory.guice.GuiceComponentProvider.newInstanceWithParameterResolvers(GuiceComponentProvider.java:120)
      info.magnolia.objectfactory.guice.GuiceComponentProvider.newInstance(GuiceComponentProvider.java:115)
      info.magnolia.objectfactory.Components.newInstance(Components.java:100)
      info.magnolia.context.JCRSessionPerThreadSystemContext.getRepositoryStrategy(JCRSessionPerThreadSystemContext.java:50)
       info.magnolia.context.AbstractContext.getJCRSession(AbstractContext.java:124)
      info.magnolia.context.MgnlContext.getJCRSession(MgnlContext.java:642)
      info.magnolia.cms.security.SilentSessionOp.exec(SilentSessionOp.java:65)
      info.magnolia.context.MgnlContext.doInSystemContext(MgnlContext.java:378)
      info.magnolia.context.MgnlContext.doInSystemContext(MgnlContext.java:356)
      info.magnolia.objectfactory.ObservedComponentFactory.load(ObservedComponentFactory.java:146)
      info.magnolia.objectfactory.ObservedComponentFactory.reload(ObservedComponentFactory.java:142)
      info.magnolia.objectfactory.ObservedComponentFactory.onEvent(ObservedComponentFactory.java:138)
      info.magnolia.observation.DeferringEventListener$ObservationBasedDelayedExecutor$1.run(DeferringEventListener.java:102)
      info.magnolia.cms.util.DelayedExecutor$RunnableWrapper.run(DelayedExecutor.java:103)
      EDU.oswego.cs.dl.util.concurrent.ClockDaemon$RunLoop.run(Unknown Source)
      java.lang.Thread.run(Thread.java:748)
      

        Acceptance criteria

              Unassigned Unassigned
              mduerig Michael Duerig
              Foundation
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

                Created:
                Updated:

                  Bug DoR
                  Task DoD