JDK-6850402 : Deadlock on sun.security.jca.ProviderConfig starting from jdk7-b55
  • Type: Bug
  • Component: security-libs
  • Sub-Component: java.security
  • Affected Version: 7
  • Priority: P2
  • Status: Closed
  • Resolution: Fixed
  • OS: generic
  • CPU: generic
  • Submitted: 2009-06-11
  • Updated: 2011-03-31
  • Resolved: 2011-03-07
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 7
7 b116Fixed
Related Reports
Relates :  
Relates :  
Description
JCK6b java_beans and java_security tests run in parallel in different threads do hang
because of following deadlock:

================================

Found one Java-level deadlock:
=============================
"Thread-50":
  waiting to lock monitor 0x081093a8 (object 0xc6d713c0, a java.lang.Class),
  which is held by "Thread-39"
"Thread-39":
  waiting to lock monitor 0x0833a8ac (object 0xc2d45810, a sun.security.jca.ProviderConfig),
  which is held by "Thread-50"

Java stack information for the threads listed above:
===================================================

"Thread-50":
        at sun.security.jca.Providers.endThreadProviderList(Providers.java:229)
        - waiting to lock <0xc6d713c0> (a java.lang.Class for sun.security.jca.Providers)
        at sun.security.jca.Providers.stopJarVerification(Providers.java:127)
        at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:195)
        at java.util.jar.JarVerifier.processEntry(JarVerifier.java:294)
        at java.util.jar.JarVerifier.update(JarVerifier.java:205)
        at java.util.jar.JarFile.initializeVerifier(JarFile.java:338)
        at java.util.jar.JarFile.getInputStream(JarFile.java:403)
        - locked <0xc2d44ea8> (a java.util.jar.JarFile)
        at sun.misc.URLClassPath$JarLoader$2.getInputStream(URLClassPath.java:735)
        at sun.misc.Resource.cachedInputStream(Resource.java:76)
        - locked <0xc2d45790> (a sun.misc.URLClassPath$JarLoader$2)
        at sun.misc.Resource.getByteBuffer(Resource.java:171)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:348)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:75)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:294)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:288)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:287)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:391)
        - locked <0xc2d457e0> (a java.lang.Object)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:384)
        - locked <0xc2d45808> (a java.lang.Object)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:307)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:331)
        at sun.security.jca.ProviderConfig$2.run(ProviderConfig.java:215)
        at sun.security.jca.ProviderConfig$2.run(ProviderConfig.java:206)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.security.jca.ProviderConfig.doLoadProvider(ProviderConfig.java:206)
        at sun.security.jca.ProviderConfig.getProvider(ProviderConfig.java:187)
        - locked <0xc2d45810> (a sun.security.jca.ProviderConfig)
        at sun.security.jca.ProviderList.getProvider(ProviderList.java:232)
        at sun.security.jca.ProviderList.getService(ProviderList.java:330)
        at sun.security.jca.GetInstance.getInstance(GetInstance.java:157)
        at java.security.Security.getImpl(Security.java:696)
        at java.security.MessageDigest.getInstance(MessageDigest.java:146)
        at java.io.ObjectStreamClass.computeDefaultSUID(ObjectStreamClass.java:1769)
        at java.io.ObjectStreamClass.access$100(ObjectStreamClass.java:69)
        at java.io.ObjectStreamClass$1.run(ObjectStreamClass.java:222)
        at java.io.ObjectStreamClass$1.run(ObjectStreamClass.java:220)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.io.ObjectStreamClass.getSerialVersionUID(ObjectStreamClass.java:219)
        at java.io.ObjectStreamClass.writeNonProxy(ObjectStreamClass.java:684)
        at java.io.ObjectOutputStream.writeClassDescriptor(ObjectOutputStream.java:657)
        at java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1262)
        at java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1220)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1404)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1167)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1526)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1491)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1409)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1167)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:343)
        at javasoft.sqe.serial.util.Convert.writeObjectToByteArray(Convert.java:69)
        at javasoft.sqe.serial.util.Convert.objectToStreamObject(Convert.java:36)
        at javasoft.sqe.tests.api.java.beans.beancontext.BeanContextServicesSupport.BCSSServiceProvider.se
rial.ConstructorTests.serial2001(ConstructorTests.java:61)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:623)
        at javasoft.sqe.javatest.lib.MultiTest.invokeTestCase(MultiTest.java:406)
        at javasoft.sqe.javatest.lib.MultiTest.run(MultiTest.java:195)
        at nsk.stress.share.StressTest$TestThread.runTest(StressTest.java:739)
        at nsk.stress.share.StressTest$TestThread.run(StressTest.java:755)
"Thread-39":
        at sun.security.jca.ProviderConfig.getProvider(ProviderConfig.java:168)
        - waiting to lock <0xc2d45810> (a sun.security.jca.ProviderConfig)
        at sun.security.jca.ProviderList.loadAll(ProviderList.java:281)
        at sun.security.jca.ProviderList.removeInvalid(ProviderList.java:298)
        at sun.security.jca.Providers.getFullProviderList(Providers.java:170)
        - locked <0xc6d713c0> (a java.lang.Class for sun.security.jca.Providers)
        at java.security.Security.getProviders(Security.java:457)
        at javasoft.sqe.jck.lib.ProviderTest.initialize(ProviderTest.java:326)
        at javasoft.sqe.jck.lib.ProviderTest.init(ProviderTest.java:272)
        at javasoft.sqe.javatest.lib.MultiTest.init(MultiTest.java:545)
        at javasoft.sqe.javatest.lib.MultiTest.run(MultiTest.java:168)
        at nsk.stress.share.StressTest$TestThread.runTest(StressTest.java:739)
        at nsk.stress.share.StressTest$TestThread.run(StressTest.java:755)

Found 1 deadlock.


===================

Comments
EVALUATION The deadlock can be addressed by reducing the scope of the held lock in sun.security.jca.Providers.getFullProviderList() from the entire method to the relevant block of code.
03-07-2009

EVALUATION Although the deadlock is somewhat relevant to the changes of 6440846, it doesn't necessarily mean that ProviderConfig.java should be reverted back to its old lock.
18-06-2009