-
Bug
-
Resolution: Done
-
Major
-
36.0.0.Final
-
None
-
-
---
-
---
I saw it on wildfly-preview-36.0.0.Final. We have 2 JPA applications deploying at the same time and we sometimes see this deadlock in the logs:
Thread: "ServerService Thread Pool – 92" Id=1121 RUNNABLE daemon=false at org.hibernate.models.hibernate-models//org.hibernate.models.spi.ClassBasedTypeDetails.<clinit>(ClassBasedTypeDetails.java:18) at org.hibernate.models.hibernate-models//org.hibernate.models.internal.jdk.JdkTrackingTypeSwitch.caseClass(JdkTrackingTypeSwitch.java:60) at org.hibernate.models.hibernate-models//org.hibernate.models.internal.jdk.JdkTrackingTypeSwitcher.switchType(JdkTrackingTypeSwitcher.java:46) at org.hibernate.models.hibernate-models//org.hibernate.models.internal.jdk.JdkBuilders.toTypeDetails(JdkBuilders.java:172)
Thread: "ServerService Thread Pool – 91" Id=926 RUNNABLE daemon=false at org.hibernate.models.hibernate-models//org.hibernate.models.internal.jdk.JdkTrackingTypeSwitch.caseClass(JdkTrackingTypeSwitch.java:65) at org.hibernate.models.hibernate-models//org.hibernate.models.internal.jdk.JdkTrackingTypeSwitcher.switchType(JdkTrackingTypeSwitcher.java:46) at org.hibernate.models.hibernate-models//org.hibernate.models.internal.jdk.JdkBuilders.toTypeDetails(JdkBuilders.java:172)
So in JdkTrackingTypeSwitch.java:60 it loads in a record PrimitiveTypeDetailsImpl -> interface PrimitiveTypeDetails -> interface ClassBasedTypeDetails
And on ClassBasedTypeDetails.java:18 it has the following line:
ClassTypeDetails OBJECT_TYPE_DETAILS = new ClassTypeDetailsImpl( ClassDetails.OBJECT_CLASS_DETAILS, Kind.CLASS );
But on JdkTrackingTypeSwitch.java:65 we have the line:
return new ClassTypeDetailsImpl( classDetails, TypeDetails.Kind.CLASS );
So I think thread 91 has the lock on classloader becuase its loading ClassTypeDetailsImpl
which tryes to initialize it's superinterface:
class ClassTypeDetailsImpl -> interface ClassTypeDetails -> interface ClassBasedTypeDetails
But thread 92 has ClassBasedTypeDetails locked with clinit on which run it tryes to load ClassTypeDetailsImpl, but can't beause thread 91 has locked the classloader.
As usual thread dumps never show a <clinit> lock. But for some reason it also does not show the classloader lock.
I managed to reproduce it without wildfly if I extracted ClassTypeDetailsImpl and PrimitiveTypeDetailsImpl with their hierarchy to a separate application.
Added a sleep 2 before ClassBasedTypeDetails.java:18 and made sure new PrimitiveTypeDetailsImpl() is called before calling new ClassTypeDetailsImpl() (once the first thread is doing it's 2 sec sleep).
One solution would be to make sure that the clinit of ClassBasedTypeDetails is called before we enter JdkTrackingTypeSwitch.caseClass.
Another would to be make sure that the clinit of ClassBasedTypeDetails is not needed to be called at all.
I can send the extracted classes with the sleeps if needed.
An example of the full stack from the clinit side:
Thread: "ServerService Thread Pool -- 92" Id=1121 RUNNABLE daemon=false at org.hibernate.models.hibernate-models//org.hibernate.models.spi.ClassBasedTypeDetails.<clinit>(ClassBasedTypeDetails.java:18) at org.hibernate.models.hibernate-models//org.hibernate.models.internal.jdk.JdkTrackingTypeSwitch.caseClass(JdkTrackingTypeSwitch.java:60) at org.hibernate.models.hibernate-models//org.hibernate.models.internal.jdk.JdkTrackingTypeSwitcher.switchType(JdkTrackingTypeSwitcher.java:46) at org.hibernate.models.hibernate-models//org.hibernate.models.internal.jdk.JdkBuilders.toTypeDetails(JdkBuilders.java:172) at org.hibernate.models.hibernate-models//org.hibernate.models.internal.jdk.JdkBuilders.buildGetterDetails(JdkBuilders.java:165) at org.hibernate.models.hibernate-models//org.hibernate.models.internal.jdk.JdkBuilders.buildMethodDetails(JdkBuilders.java:140) at org.hibernate.models.hibernate-models//org.hibernate.models.internal.jdk.JdkClassDetails.getMethods(JdkClassDetails.java:210) at org.hibernate@7.0.0.Beta5//org.hibernate.boot.model.internal.InheritanceState.determineDefaultAccessType(InheritanceState.java:268) at org.hibernate@7.0.0.Beta5//org.hibernate.boot.model.internal.InheritanceState.getElementsToProcess(InheritanceState.java:233) at org.hibernate@7.0.0.Beta5//org.hibernate.boot.model.internal.InheritanceState.postProcess(InheritanceState.java:166) at org.hibernate@7.0.0.Beta5//org.hibernate.boot.model.internal.EntityBinder.handleIdentifier(EntityBinder.java:370) at org.hibernate@7.0.0.Beta5//org.hibernate.boot.model.internal.EntityBinder.bindEntityClass(EntityBinder.java:214) at org.hibernate@7.0.0.Beta5//org.hibernate.boot.model.internal.AnnotationBinder.bindClass(AnnotationBinder.java:240) at org.hibernate@7.0.0.Beta5//org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:203) at org.hibernate@7.0.0.Beta5//org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:307) at org.hibernate@7.0.0.Beta5//org.hibernate.boot.model.process.spi.MetadataBuildingProcess.coordinateProcessors(MetadataBuildingProcess.java:341) at org.hibernate@7.0.0.Beta5//org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:215) at org.hibernate@7.0.0.Beta5//org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1402) at org.hibernate@7.0.0.Beta5//org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.populateSessionFactoryBuilder(EntityManagerFactoryBuilderImpl.java:1483) at org.hibernate@7.0.0.Beta5//org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1465) at org.hibernate.jipijapa-hibernate@36.0.0.Final//org.wildfly.persistence.jipijapa.hibernate7.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:31) at org.jboss.as.jpa@36.0.0.Final//org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:159) at org.jboss.as.jpa@36.0.0.Final//org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:117) at java.base@17.0.14/java.security.AccessController.executePrivileged(AccessController.java:776) at java.base@17.0.14/java.security.AccessController.doPrivileged(AccessController.java:399) at org.wildfly.security.elytron-base@2.6.2.Final//org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:664) at org.jboss.as.jpa@36.0.0.Final//org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:201) at org.jboss.threads@2.4.0.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990) at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486) at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377) at java.base@17.0.14/java.lang.Thread.run(Thread.java:840) at org.jboss.threads@2.4.0.Final//org.jboss.threads.JBossThread.run(JBossThread.java:513)
- is incorporated by
-
WFLY-20732 Upgrade WildFly Preview to Hibernate ORM 7.0.2.Final
-
- Resolved
-
- is caused by
-
HHH-19430 Loading...