[MAGNOLIA-8384] ThreadLocal leaking SystemRepositoryStrategy instances Created: 26/Apr/22  Updated: 27/Oct/22

Status: Open
Project: Magnolia
Component/s: core
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Neutral
Reporter: Michael Duerig Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: foundation_team
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Relates
relates to MGNLEE-645 Cannot stop Magnolia since tomcat upg... Closed
Template:
Acceptance criteria:
Empty
Task DoD:
[ ]* Doc/release notes changes? Comment present?
[ ]* Downstream builds green?
[ ]* Solution information and context easily available?
[ ]* Tests
[ ]* FixVersion filled and not yet released
[ ]  Architecture Decision Record (ADR)
Bug DoR:
[X]* Steps to reproduce, expected, and actual results filled
[ ]* Affected version filled
Team: Foundation

 Description   

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)


 Comments   
Comment by Michael Duerig [ 26/Apr/22 ]

See the first comment from dai.ha , which links to a potential fix: https://jira.magnolia-cms.com/browse/MGNLEE-645?focusedCommentId=266310&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-266310

Generated at Mon Feb 12 04:32:15 CET 2024 using Jira 9.4.2#940002-sha1:46d1a51de284217efdcb32434eab47a99af2938b.