Thanks for the tips.  We'll use that to see if we can learn anymore.
I guess the main thing I want to try and figure out is if this is a Tapestry 
problem, or a problem in something we're doing with Tapestry.
The latter seems more likely but we'll try to find out.

The good news is that we can reproduce this fairly consistently on server 
startup under simulated load, so we'll see what we can learn.

-----Original Message-----
From: Ben Weidig <b...@netzgut.net>
Sent: Sunday, November 17, 2024 8:14 AM
To: Tapestry users <users@tapestry.apache.org>
Subject: Re: Thread locking (deadlock) issue using Tapestry 5.8.7 under heavy 
load

[You don't often get email from b...@netzgut.net. Learn why this is important 
at https://aka.ms/LearnAboutSenderIdentification ]

Hi Scott,

Thanks for bringing this issue to our attention.

I've looked through the JIRA and found
https://issues.apache.org/jira/browse/TAP5-2621 with a similar thread dump 
attached.

We're running multiple Tapestry instances with a varying degree of concurrent 
users and have yet to encounter a ClassLoader deadlock.

Debugging and finding a deadlock in a ClassLoader is quite challenging due to 
the overall complexity of class loading.
Deadlocks are quite hard to track down if there's no obvious problem in the 
ClassLoader code itself.
That said, there are steps to gather additional information that might help 
pinpoint the root cause.

Be aware that these are just my suggestions, as I'm highly versed ClassLoader 
infrastructure, maybe Thiago has some additional insights or better ideas

In my opinion, identifying the specific class (and its dependencies) that 
triggers the deadlock would be an important first step. This could help 
highlight potential issues such as cyclic class dependencies, complex static 
initializers, or nested class loading.

If the deadlock consistently involves the same classes, it would be a good 
starting point.

Depending on your JVM/execution environment, you could try to enable more 
detailed logging around class loading using some of the following arguments:

-verbose:class
-XX:+UnlockDiagnosticVMOptions
-XX:+PrintConcurrentLocks
-XX:+TraceClassLoading
-XX:+TraceClassResolution

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

Having a full thread dump so https://jstack.review/ could visualize and making 
it easier to navigate could be helpful, too.

Unfortunately, without a reproducible test case, it’s difficult to provide more 
concrete help, as these kind of issues usually require direct observation and 
debugability :-/

Cheers
Ben



On Fri, Nov 15, 2024 at 4:38 PM Scott McCarthy <scott.mccar...@clarivate.com>
wrote:

> Hi All,
>
> I just realised I'd previously posted this into the DEV group when I
> should have posted it in the USER group.
> Reposting in the correct mailing list - Sorry about that...
>
> I'll likely raise a JIRA ticket for this, but I wanted to start with
> this mailing list.
> I'll try to explain what we're seeing...
>
> We are running a fairly large Tapestry application with hundreds of
> concurrent users.
> When under load, we are occasionally seeing an instance go into
> deadlock, whereby the Tomcat threads max out, but the CPU is virtually zero.
> This can commonly occur when a new instance starts up under heavy
> load, but can also happen on an instance that has been running for several 
> days.
>
> The log files give clues as to what's happening, but nothing definitive.
> For example:
>
>
> 2024-11-12T15:26:20.925Z {name=ip-10-242-182-176.ec2.internal} ERROR
> [2024-11-12T15:26:13,611]
> PQSL-STAT,start=2024-11-11.14:23:02,instance=i-01da4661bc7f47e18,host=
> ip-10-242-182-176,sub=main,version=2024.11.0.7644
> 31/10/2024
> 07:39:01,hours=25.05,threadBlktime=0,threads=408,run=57,block=38,wait=
> 133,timed=180,locks=[org.apache.tapestry5.services.pageload.PageClassL
> oaderContextManagerImpl(2),java.util.jar.JarFile(10),java.lang.Object(
> 25),java.io.ExpiringCache(1)],heapuse=16092,heapmax=24849,gc=1,
>
> 2024-11-12T15:26:20.925Z {name=ip-10-242-182-176.ec2.internal} ERROR
> [2024-11-12T15:26:13,611]         java.base@11.0.16
> /java.util.zip.ZipFile.getEntry(ZipFile.java:347)<mailto:java.base@11.
> 0.16 /java.util.zip.ZipFile.getEntry(ZipFile.java:347)>
>
> 2024-11-12T15:26:20.925Z {name=ip-10-242-182-176.ec2.internal}
>  java.base@11.0.16
> /java.util.zip.ZipFile$1.getEntry(ZipFile.java:1143)<mailto:
> java.base@11.0.16/java.util.zip.ZipFile$1.getEntry(ZipFile.java:1143)>
>
> 2024-11-12T15:26:20.925Z {name=ip-10-242-182-176.ec2.internal}
>  java.base@11.0.16
> /java.util.jar.JarFile.getEntry0(JarFile.java:586)<mailto:
> java.base@11.0.16/java.util.jar.JarFile.getEntry0(JarFile.java:586)>
>
> 2024-11-12T15:26:20.925Z {name=ip-10-242-182-176.ec2.internal}
>  java.base@11.0.16
> /java.util.jar.JarFile.getEntry(JarFile.java:516)<mailto:java.base@11.
> 0.16 /java.util.jar.JarFile.getEntry(JarFile.java:516)>
>
> 2024-11-12T15:26:20.926Z {name=ip-10-242-182-176.ec2.internal}
>  java.base@11.0.16
> /java.util.jar.JarFile.getJarEntry(JarFile.java:478)<mailto:
> java.base@11.0.16/java.util.jar.JarFile.getJarEntry(JarFile.java:478)>
>
> 2024-11-12T15:26:20.926Z {name=ip-10-242-182-176.ec2.internal}
> org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.getA
> rchiveEntry(AbstractSingleArchiveResourceSet.java:97)
>
> 2024-11-12T15:26:20.926Z {name=ip-10-242-182-176.ec2.internal}
>
> org.apache.catalina.webresources.AbstractArchiveResourceSet.getResourc
> e(AbstractArchiveResourceSet.java:244)
>
> 2024-11-12T15:26:20.926Z {name=ip-10-242-182-176.ec2.internal}
>
> org.apache.catalina.webresources.StandardRoot.getResourceInternal(Stan
> dardRoot.java:272)
>
> 2024-11-12T15:26:20.926Z {name=ip-10-242-182-176.ec2.internal}
>  org.apache.catalina.webresources.Cache.getResource(Cache.java:64)
>
> 2024-11-12T15:26:20.926Z {name=ip-10-242-182-176.ec2.internal}
>
> org.apache.catalina.webresources.StandardRoot.getResource(StandardRoot
> .java:211)
>
> 2024-11-12T15:26:20.926Z {name=ip-10-242-182-176.ec2.internal}
>
> org.apache.catalina.webresources.StandardRoot.getClassLoaderResource(S
> tandardRoot.java:220)
>
> 2024-11-12T15:26:20.926Z {name=ip-10-242-182-176.ec2.internal}
>
> org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(Web
> appClassLoaderBase.java:2170)
>
> 2024-11-12T15:26:20.926Z {name=ip-10-242-182-176.ec2.internal}
>
> org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClass
> LoaderBase.java:797)
>
> 2024-11-12T15:26:20.926Z {name=ip-10-242-182-176.ec2.internal}
>
> org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClass
> LoaderBase.java:1272)
>
> 2024-11-12T15:26:20.926Z {name=ip-10-242-182-176.ec2.internal}
>
> org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClass
> LoaderBase.java:1120)
>
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal} ERROR
> [2024-11-12T15:47:08,652]
> PQSL-STAT,start=2024-11-12.15:46:07,instance=i-05996408538cc4fa2,host=
> ip-10-243-125-250,sub=main,version=2024.11.0.7644
> 31/10/2024
> 07:39:01,hours=0.02,threadBlktime=0,threads=130,run=16,block=12,wait=7
> 8,timed=24,locks=[org.apache.tapestry5.internal.plastic.PlasticClassLo
> ader(9),org.apache.tapestry5.beanmodel.internal.services.PropertyAcces
> sImpl(3)],heapuse=607,heapmax=24849,gc=7,
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal} ERROR
> [2024-11-12T15:47:08,653]
>
> org.apache.tapestry5.internal.plastic.PlasticClassPool.realizeTransfor
> medClass(PlasticClassPool.java:164)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.internal.plastic.PlasticClassImpl.createInstantia
> tor(PlasticClassImpl.java:650)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.plastic.PlasticManager.createProxy(PlasticManager
> .java:289)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.plastic.PlasticManager.createProxy(PlasticManager
> .java:262)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.plastic.PlasticManager.createProxy(PlasticManager
> .java:229)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.beanmodel.services.PlasticProxyFactoryImpl.create
> Proxy(PlasticProxyFactoryImpl.java:86)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
> org.apache.tapestry5.beanmodel.internal.services.PropertyConduitSource
> Impl.build(PropertyConduitSourceImpl.java:1527)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
> org.apache.tapestry5.beanmodel.internal.services.PropertyConduitSource
> Impl.create(PropertyConduitSourceImpl.java:1441)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
> $PropertyConduitSource_134db79fe0.create(Unknown Source)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.internal.bindings.PropBindingFactory.newBinding(P
> ropBindingFactory.java:56)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
> $BindingFactory_134db7a16b.newBinding(Unknown Source)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
> $BindingFactory_134db7a162.newBinding(Unknown Source)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.internal.services.BindingSourceImpl.newBinding(Bi
> ndingSourceImpl.java:82)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
> $BindingSource_134db7a0ba.newBinding(Unknown Source)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
> org.apache.tapestry5.internal.services.PageElementFactoryImpl.parseAtt
> ributeExpansionExpression(PageElementFactoryImpl.java:117)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.internal.services.PageElementFactoryImpl.newBindi
> ng(PageElementFactoryImpl.java:177)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
> $PageElementFactory_134db7a0d5.newBinding(Unknown Source)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.internal.pageload.PageLoaderImpl$10.execute(PageL
> oaderImpl.java:941)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl.runActio
> ns(ComponentAssemblerImpl.java:229)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl.access$3
> 00(ComponentAssemblerImpl.java:37)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl$2.run(Co
> mponentAssemblerImpl.java:180)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.ioc.internal.OperationTrackerImpl.run(OperationTr
> ackerImpl.java:56)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.run(PerThr
> eadOperationTracker.java:60)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.ioc.internal.RegistryImpl.run(RegistryImpl.java:1
> 286)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
> org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl.assemble
> EmbeddedComponent(ComponentAssemblerImpl.java:158)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.internal.pageload.PageLoaderImpl$12.execute(PageL
> oaderImpl.java:1021)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl.runActio
> ns(ComponentAssemblerImpl.java:229)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl.access$3
> 00(ComponentAssemblerImpl.java:37)
>
> 2024-11-12T15:47:12.497Z {name=ip-10-243-125-250.ec2.internal}
>
> org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl$2.run(Co
> mponentAssemblerImpl.java:180)
>
>
> 2024-11-12T16:16:05.913Z {name=ip-10-243-120-52.ec2.internal} ERROR
> [2024-11-12T16:15:56,585]
> PQSL-STAT,start=2024-11-11.14:22:40,instance=i-08bb147e7134c32e0,host=
> ip-10-243-120-52,sub=main,version=2024.11.0.7644
> 31/10/2024
> 07:39:01,hours=25.89,threadBlktime=0,threads=436,run=70,block=93,wait=
> 135,timed=130,locks=[org.apache.tapestry5.ioc.internal.util.Concurrent
> Barrier$ThreadBoolean(31),
> java.io
> .RandomAccessFile(2),org.apache.logging.log4j.core.appender.rolling.Ro
> llingFileManager(1),java.lang.Object(45),org.apache.catalina.webresour
> ces.CachedResource(14)],heapuse=16444,heapmax=24849,gc=1,
>
> 2024-11-12T16:16:05.913Z {name=ip-10-243-120-52.ec2.internal} ERROR
> [2024-11-12T16:15:56,585]
> org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.getA
> rchiveEntries(AbstractSingleArchiveResourceSet.java:66)
>
> 2024-11-12T16:16:05.913Z {name=ip-10-243-120-52.ec2.internal}
>
> org.apache.catalina.webresources.AbstractArchiveResourceSet.getResourc
> e(AbstractArchiveResourceSet.java:246)
>
> 2024-11-12T16:16:05.914Z {name=ip-10-243-120-52.ec2.internal}
>
> org.apache.catalina.webresources.StandardRoot.getResourceInternal(Stan
> dardRoot.java:272)
>
> 2024-11-12T16:16:05.914Z {name=ip-10-243-120-52.ec2.internal}
>
> org.apache.catalina.webresources.CachedResource.validateResource(Cache
> dResource.java:127)
>
> 2024-11-12T16:16:05.914Z {name=ip-10-243-120-52.ec2.internal}
>  org.apache.catalina.webresources.Cache.getResource(Cache.java:78)
>
> 2024-11-12T16:16:05.914Z {name=ip-10-243-120-52.ec2.internal}
>
> org.apache.catalina.webresources.StandardRoot.getResource(StandardRoot
> .java:211)
>
> 2024-11-12T16:16:05.914Z {name=ip-10-243-120-52.ec2.internal}
>
> org.apache.catalina.webresources.StandardRoot.getClassLoaderResource(S
> tandardRoot.java:220)
>
> 2024-11-12T16:16:05.914Z {name=ip-10-243-120-52.ec2.internal}
>
> org.apache.catalina.loader.WebappClassLoaderBase.findResource(WebappCl
> assLoaderBase.java:872)
>
> 2024-11-12T16:16:05.914Z {name=ip-10-243-120-52.ec2.internal}
>
> org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappCla
> ssLoaderBase.java:981)
>
> 2024-11-12T16:16:05.914Z {name=ip-10-243-120-52.ec2.internal}
>  java.base@11.0.16/java.lang.Class.getResource(Class.java:2740)<mailto:
> java.base@11.0.16/java.lang.Class.getResource(Class.java:2740)>
>
>
> 07:39:01,hours=0.05,threadBlktime=0,threads=135,run=15,block=10,wait=8
> 4,timed=26,locks=[org.apache.tapestry5.internal.plastic.PlasticClassPo
> ol(3),java.util.concurrent.ConcurrentHashMap$ReservationNode(2),java.u
> til.concurrent.ConcurrentHashMap$Node(1),org.apache.tapestry5.beanmode
> l.internal.services.PropertyAccessImpl(3),java.lang.Object(1)],heapuse
> =279,heapmax=24849,gc=1,
> ERROR [2024-11-14T12:12:47,871]
>  
> org.apache.tapestry5.internal.plastic.PlasticClassLoader.loadClass(PlasticClassLoader.java:59)
>         java.base@11.0.16
> /java.lang.ClassLoader.loadClass(ClassLoader.java:522)<mailto:
> java.base@11.0.16/java.lang.ClassLoader.loadClass(ClassLoader.java:522
> )>
>
> org.apache.tapestry5.internal.plastic.PlasticClassPool.createTransform
> ation(PlasticClassPool.java:511)
>
>
> org.apache.tapestry5.internal.plastic.PlasticClassPool.getPlasticClass
> Transformation(PlasticClassPool.java:492)
>
> org.apache.tapestry5.internal.plastic.PlasticClassPool.loadAndTransfor
> mClass(PlasticClassPool.java:399)
>
> org.apache.tapestry5.internal.plastic.PlasticClassLoader.loadClass(PlasticClassLoader.java:76)
>         java.base@11.0.16
> /java.lang.ClassLoader.loadClass(ClassLoader.java:522)<mailto:
> java.base@11.0.16/java.lang.ClassLoader.loadClass(ClassLoader.java:522
> )>
>
> org.apache.tapestry5.internal.plastic.PlasticClassPool.getClassInstant
> iator(PlasticClassPool.java:667)
>
> org.apache.tapestry5.plastic.PlasticManager.getClassInstantiator(Plast
> icManager.java:187)
>
> org.apache.tapestry5.internal.services.ComponentInstantiatorSourceImpl
> $2.invoke(ComponentInstantiatorSourceImpl.java:436)
>
> org.apache.tapestry5.internal.services.ComponentInstantiatorSourceImpl
> $2.invoke(ComponentInstantiatorSourceImpl.java:385)
>
> org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(Operatio
> nTrackerImpl.java:82)
>
> org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(Per
> ThreadOperationTracker.java:72)
>
> org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.jav
> a:1292)
>
> org.apache.tapestry5.internal.services.ComponentInstantiatorSourceImpl
> .createInstantiatorForClass(ComponentInstantiatorSourceImpl.java:383)
>
>
> org.apache.tapestry5.internal.services.ComponentInstantiatorSourceImpl
> $$Lambda$351/0x0000000800872040.apply(Unknown
> Source)
>         java.base@11.0.16
> /java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1737)<mailto:
> java.base@11.0.16
> /java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHash
> Map.java:1737)>
>
> Have I uncovered a genuine thread locking issue that I should raise a
> JIRA ticket for?
> Or does anyone have any ideas of something I can change to prevent this?
>
> I realise I'm only providing a tiny snippet of our overall system, but
> any suggestions would be welcome.
>
> Thank you.
>
> Scott
>
> Confidentiality note: This e-mail may contain confidential information
> from Clarivate. If you are not the intended recipient, be aware that
> any disclosure, copying, distribution or use of the contents of this
> e-mail is strictly prohibited. If you have received this e-mail in
> error, please delete this e-mail and notify the sender as soon as possible.
>
Confidentiality note: This e-mail may contain confidential information from 
Clarivate. If you are not the intended recipient, be aware that any disclosure, 
copying, distribution or use of the contents of this e-mail is strictly 
prohibited. If you have received this e-mail in error, please delete this 
e-mail and notify the sender as soon as possible.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to