Possible VM deadlock due to FileSystems.getDefault and System.loadLibrary interplay

Vitaly Davidovich vitalyd at gmail.com
Wed Jan 3 16:56:23 UTC 2018


Hi all,

Consider the following stacktraces of the main app thread and a background
thread:

"main" #1 prio=5 os_prio=0 tid=0x0000000001bfd000 nid=0x1958 waiting for
monitor entry [0x00002b98ceba3000]

   java.lang.Thread.State: BLOCKED (on object monitor)

                at java.lang.Runtime.loadLibrary0(Runtime.java:862)

                - waiting to lock <0x00000007bf834b20> (a java.lang.Runtime)

                at java.lang.System.loadLibrary(System.java:1122)

                at sun.nio.fs.UnixNativeDispatcher$1.run(
UnixNativeDispatcher.java:573)

                at sun.nio.fs.UnixNativeDispatcher$1.run(
UnixNativeDispatcher.java:571)

                at java.security.AccessController.doPrivileged(Native
Method)

                at sun.nio.fs.UnixNativeDispatcher.<clinit>(
UnixNativeDispatcher.java:571)

                at sun.nio.fs.UnixFileSystem.<init>(UnixFileSystem.java:67)

                at sun.nio.fs.LinuxFileSystem.<
init>(LinuxFileSystem.java:39)

                at sun.nio.fs.LinuxFileSystemProvider.newFileSystem(
LinuxFileSystemProvider.java:46)

                at sun.nio.fs.LinuxFileSystemProvider.newFileSystem(
LinuxFileSystemProvider.java:39)

                at sun.nio.fs.UnixFileSystemProvider.<init>(
UnixFileSystemProvider.java:56)

                at sun.nio.fs.LinuxFileSystemProvider.<init>
(LinuxFileSystemProvider.java:41)

                at
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method)

                at sun.reflect.NativeConstructorAccessorImpl.newInstance(
NativeConstructorAccessorImpl.java:62)

                at sun.reflect.DelegatingConstructorAccessorI
mpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

                at java.lang.reflect.Constructor.
newInstance(Constructor.java:423)

                at java.lang.Class.newInstance(Class.java:442)

                at sun.nio.fs.DefaultFileSystemProvider.createProvider(
DefaultFileSystemProvider.java:48)

                at sun.nio.fs.DefaultFileSystemProvider.create(
DefaultFileSystemProvider.java:63)

                at java.nio.file.FileSystems$DefaultFileSystemHolder.
getDefaultProvider(FileSystems.java:108)

                at java.nio.file.FileSystems$DefaultFileSystemHolder.
access$000(FileSystems.java:89)

                at java.nio.file.FileSystems$DefaultFileSystemHolder$1.run(
FileSystems.java:98)

                at java.nio.file.FileSystems$DefaultFileSystemHolder$1.run(
FileSystems.java:96)

                at java.security.AccessController.doPrivileged(Native
Method)

                at java.nio.file.FileSystems$DefaultFileSystemHolder.
defaultFileSystem(FileSystems.java:96)

                at java.nio.file.FileSystems$DefaultFileSystemHolder.<
clinit>(FileSystems.java:90)

                at java.nio.file.FileSystems.getDefault(FileSystems.java:
176)

                at java.nio.file.Paths.get(Paths.java:84)

                at <some_package>.ServiceLoader.
setup(ServiceLoader.java:446)

                at <some_package>.MetadataAdminLoader.main(
MetadataAdminLoader.java:52)





"shardDbExecutor-0-pool-0" #33 prio=5 os_prio=0 tid=0x0000000001ebf000
nid=0x1d01 in Object.wait() [0x00002b991f941000]

   java.lang.Thread.State: RUNNABLE

                at java.nio.file.FileSystems.getDefault(FileSystems.java:
176)

                at java.nio.file.Paths.get(Paths.java:138)

                at sun.misc.Launcher$ExtClassLoader.findLibrary(
Launcher.java:224)

                at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1830)

                at java.lang.Runtime.loadLibrary0(Runtime.java:870)

                - locked <0x00000007bf834b20> (a java.lang.Runtime)

                at java.lang.System.loadLibrary(System.java:1122)

                at sun.security.ec.SunEC$1.run(SunEC.java:60)

                at sun.security.ec.SunEC$1.run(SunEC.java:58)

                at java.security.AccessController.doPrivileged(Native
Method)

                at sun.security.ec.SunEC.<clinit>(SunEC.java:58)

                at
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method)

                at sun.reflect.NativeConstructorAccessorImpl.newInstance(
NativeConstructorAccessorImpl.java:62)

                at sun.reflect.DelegatingConstructorAccessorI
mpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

                at java.lang.reflect.Constructor.
newInstance(Constructor.java:423)

                at java.lang.Class.newInstance(Class.java:442)

                at sun.security.jca.ProviderConfig$2.run(
ProviderConfig.java:221)

                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 <0x00000007bea03f48> (a sun.security.jca.
ProviderConfig)

                at sun.security.jca.ProviderList.
getProvider(ProviderList.java:233)

                at sun.security.jca.ProviderList.
getService(ProviderList.java:331)

                at sun.security.jca.GetInstance.
getInstance(GetInstance.java:157)

                at javax.net.ssl.SSLContext.getInstance(SSLContext.java:156)

                at com.microsoft.sqlserver.jdbc.
TDSChannel.enableSSL(IOBuffer.java:1658)

                at com.microsoft.sqlserver.jdbc.SQLServerConnection.
connectHelper(SQLServerConnection.java:1976)

                at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(
SQLServerConnection.java:1627)

                at com.microsoft.sqlserver.jdbc.SQLServerConnection.
connectInternal(SQLServerConnection.java:1458)

                at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(
SQLServerConnection.java:772)

                at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(
SQLServerDriver.java:1168)

                at java.sql.DriverManager.getConnection(DriverManager.
java:664)

                at java.sql.DriverManager.getConnection(DriverManager.
java:208)

                at <some_package>.ConnectionPool.createGoodConnection(
ConnectionPool.java:565)

                at <some_package>.ConnectionPool.createNewConnection(
ConnectionPool.java:519)

                at <some_package>.ConnectionPool.
getConnection(ConnectionPool.java:407)

                at <some_package>.StatementCachingConnectionImpl
.setupConnection(StatementCachingConnectionImpl.java:94)

                at <some_package>.StatementCachingConnectionImpl.<init>(
StatementCachingConnectionImpl.java:54)

                at <some_package>.TestConnectionFactories$
FaultInjectingConnection.<init>(TestConnectionFactories.java:90)

                at <some_package>.TestConnectionFactories.lambda$static$3(
TestConnectionFactories.java:33)

                at <some_package>.TestConnectionFactories$$
Lambda$12/1738236591.newConnection(Unknown Source)

                at <some_package>.SedaExecutor.
setupConnections(SedaExecutor.java:130)

                at <some_package>.SedaExecutor$SedaThreadFactory.lambda$
newThread$0(SedaExecutor.java:165)

                at
<some_package>.SedaExecutor$SedaThreadFactory$$Lambda$22/1392419022.run(Unknown
Source)

                at java.lang.Thread.run(Thread.java:748)


The application intermittently hangs on startup, and the above callstacks
are present.  It seems like there's a deadlock due to concurrent class
loading and default FileSystem initialization (which itself triggers class
loading here).

I wasn't able to find any existing JBS entries reporting anything similar.
Am I seeing this right? Is this a known issue?

Thanks


More information about the core-libs-dev mailing list