Profile Image
Aman Jain

Thread stuck on socket read - how to diagnose?

As per the thread dumps, there are multiple threads that are stuck in the following methods.

 

Can you please help with how to diagnose the root cause of the issue here?

 

Oracle JDBC call (via c3p0 connection pool):

stackTrace:
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at sun.nio.ch.IOUtil.read(IOUtil.java:197)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
- locked <0x00007f2b2c3f0098> (a java.lang.Object)
at oracle.net.nt.TimeoutSocketChannel.read(TimeoutSocketChannel.java:174)
at oracle.net.ns.NSProtocolNIO.doSocketRead(NSProtocolNIO.java:555)
at oracle.net.ns.NIOPacket.readNIOPacket(NIOPacket.java:403)
at oracle.net.ns.NSProtocolNIO.negotiateConnection(NSProtocolNIO.java:127)
at oracle.net.ns.NSProtocol.connect(NSProtocol.java:340)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1596)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:588)
at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:793)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:57)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:747)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:562)
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203)

 

RMI TCP Connection (our application uses RMI protocol):

 

stackTrace:
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
- locked <0x00007f2b2c36ff68> (a java.io.BufferedInputStream)
at java.io.FilterInputStream.read(FilterInputStream.java:83)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:555)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$565/1654260980.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:



Report URL - https://fastthread.io/my-thread-report.jsp?p=c2hhcmVkLzIwMjEvMDMvMTUvLS1LTl9UaHJlYWRfRHVtcF8yMDIxLTAzLTE1XzE3XzQzLmxvZy0tMTktNC0xNTs7LS1LTl9UaHJlYWRfRHVtcF8yMDIxLTAzLTE1XzE3XzQzLmxvZy0tMTktNC0xNQ==

  • threadstuck

  • socketread

  • multiplethreads

  • oraclejdbccall

  • rmitcpconnection

Please Sign In or to post your comment or answer

Profile Image

Mahesh

Hi Aman!

 

In the attached fastThread report I could see 17 threads are waiting for a response from other external applications. You can click on the "stacktrace" hyperlink to see more details.

 

 

JDK's java.net layer uses SocketInputStream.socketRead0() API to read and receive the data from the external application. Sometimes your application might not get a response from the external applications. In that case, your application thread will be stuck in this java.net.SocketInputStream.socketRead0() API.

To fix the issue, you can set the appropriate timeout settings. You may consider passing -Doracle.jdbc.ReadTimeout system property. 

 

Note: You need to pass the above argument during application startup. Value needs to be specified in milliseconds.

 

Got something else on mind? Post Your Question

Not the answer you're looking for? Browse other questions tagged
  • threadstuck

  • socketread

  • multiplethreads

  • oraclejdbccall

  • rmitcpconnection