Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stuck thread due to WeakHashMap #180

Closed
lananda opened this issue Jul 19, 2022 · 6 comments · Fixed by #182
Closed

Stuck thread due to WeakHashMap #180

lananda opened this issue Jul 19, 2022 · 6 comments · Fixed by #182

Comments

@lananda
Copy link

lananda commented Jul 19, 2022

Stuck threads at
(self-tuning)'" #262 daemon prio=1 os_prio=0 tid=0x00007f1480091000
nid=0x187a runnable [0x00007f1456863000]
java.lang.Thread.State: RUNNABLE
at java.util.WeakHashMap.get(WeakHashMap.java:403)
at
javax.validation.Validation$GetValidationProviderListAction.getCachedValidatio

nProviders(Validation.java:368)

  • locked <0x00000005f44e3e10> (a
    javax.validation.Validation$GetValidationProviderListAction)
    at
    javax.validation.Validation$GetValidationProviderListAction.run(Validation.jav

a:323)
at
javax.validation.Validation$GetValidationProviderListAction.getValidationProvi

derList(Validation.java:316)
at
javax.validation.Validation$DefaultValidationProviderResolver.getValidationPro

viders(Validation.java:299)

this is because WeakHashMap is not synchronized

@lananda
Copy link
Author

lananda commented Jul 20, 2022

there's a Eclipselink createEntityManager call that's blocked on the HashMap

java.lang.Thread.State: BLOCKED (on object monitor)
at oracle.security.jps.internal.policystore.rdbms.JpsDBDataManager.getEMFAndSubject(JpsDBDataManager.java:1823)

  • waiting to lock <0x00000005c450d0b0> (a java.util.HashMap)
    at oracle.security.jps.internal.policystore.rdbms.JpsDBDataManager.init(JpsDBDataManager.java:1484)
    at oracle.security.jps.internal.policystore.rdbms.JpsDBDataManager.jpsObjectListQuery(JpsDBDataManager.java:4307)
    at oracle.security.jps.internal.policystore.rdbms.JpsDBDataManager.jpsObjectListQuery(JpsDBDataManager.java:4300)
    at oracle.security.jps.internal.policystore.entitymanager.impl.InternalQueryManagerImpl.getAppRoles(InternalQueryManagerImpl.java:430)
    at oracle.security.jps.az.internal.management.pd.service.GenericPolicyDistributionService.internalGetDirectAppRoles(GenericPolicyDistributionService.java:1596)

@yrodiere
Copy link
Contributor

This is a different lock and a different map. I don't see how that would be related to Hibernate Validator.

Can you post a full thread dump, with all the threads?

yrodiere added a commit to yrodiere/validation that referenced this issue Jul 20, 2022
…roviderListAction#providersPerClassloader

`clearCache` was a static method and thus was synchronized on the class,
while `getCachedValidationProviders`/`cacheValidationProviders`
are instance methods and thus are synchronized on a particular instance.
This means it was theoretically possible for `clearCache` and
`getCachedValidationProviders`/`cacheValidationProviders` to access the
providersPerClassloader map concurrently,
which is a problem because WeakHashMap is not thread-safe.

This may fix jakartaee#180, though it's hard to say without a proper thread dump
showing what the cause of the deadlock was exactly.

In any case, this will prevent synchronization issues for integrators
that call Validation#clearDefaultValidationProviderResolverCache
concurrently to Validation.DefaultValidationProviderResolver#getValidationProviders.
@lananda
Copy link
Author

lananda commented Jul 20, 2022

[STUCK] ExecuteThread: '134' for queue: 'weblogic.kernel.Default
(self-tuning)'" #262 daemon prio=1 os_prio=0 tid=0x00007f1480091000
nid=0x187a runnable [0x00007f1456863000]
java.lang.Thread.State: RUNNABLE
at java.util.WeakHashMap.get(WeakHashMap.java:403)
at
javax.validation.Validation$GetValidationProviderListAction.getCachedValidatio
nProviders(Validation.java:368)

  • locked <0x00000005f44e3e10> (a
    javax.validation.Validation$GetValidationProviderListAction)
    at
    javax.validation.Validation$GetValidationProviderListAction.run(Validation.jav
    a:323)
    at
    javax.validation.Validation$GetValidationProviderListAction.getValidationProvi
    derList(Validation.java:316)
    at
    javax.validation.Validation$DefaultValidationProviderResolver.getValidationPro
    viders(Validation.java:299)
    at
    javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:257
    )
    at
    javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:110)
    at
    org.eclipse.persistence.internal.jpa.deployment.BeanValidationInitializationHe
    lper$BeanValidationInitializationHelperImpl.getValidatorFactory(BeanValidation
    InitializationHelper.java:78)
    at
    org.eclipse.persistence.internal.jpa.deployment.BeanValidationInitializationHe
    lper$BeanValidationInitializationHelperImpl.bootstrapBeanValidation(BeanValida
    tionInitializationHelper.java:43)
    at
    org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.addBeanValidationL
    isteners(EntityManagerSetupImpl.java:3603)
    at
    org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManag
    erSetupImpl.java:662)
    at
    org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getAbstractS
    ession(EntityManagerFactoryDelegate.java:207)
  • locked <0x00000005f44e3fa0> (a
    org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate)
    at
    org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntity
    ManagerImpl(EntityManagerFactoryDelegate.java:307)
    at
    org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityMana
    gerImpl(EntityManagerFactoryImpl.java:337)
    at
    org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityMana
    ger(EntityManagerFactoryImpl.java:303)

@yrodiere
Copy link
Contributor

That's not a full thread dump. That's just one thread.

@lananda
Copy link
Author

lananda commented Jul 20, 2022

That's not a full thread dump. That's just one thread.

I cannot share the full thread dump here.

@yrodiere
Copy link
Contributor

I see. Well, I can't debug a deadlock from information about a single thread, since a deadlock obviously involves multiple threads. Hopefully you will be able to pinpoint all threads involved in the deadlock and post the stacktraces of those. Good luck :)

@gsmet gsmet closed this as completed in #182 Aug 2, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
2 participants