Deadlock in SSLSocket locks Finalizer
Dmitry Neverov
Dmitry.Neverov at jetbrains.com
Fri Sep 20 10:22:42 UTC 2013
Hi,
we have a strange problem with ssl sockets. I didn't find anything
similar in the bug tracker. I've posted a bug twice, but have never got
back. Maybe someone can help.
We see an example of the deadlock described in
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8013809. The strange
thing is that one of the locked threads is a Finalizer and the other one
is an application thread. It seems like the socket used by an
application is being finalized:
"Finalizer" daemon group="system" prio=8 tid=3 nid=3 waiting on java.util.concurrent.locks.ReentrantLock$NonfairSync at 188a1f7
by "TC: 17:37:45 getCurrentState: "CMLS Root" {instance id=321, parent internal id=321, parent id=CMLS_Root, description: "https://gitblit.cid-dev.net/gitblit-0.9.2/git/CMLS/CMLS.Classifiers.NaiveBayes.git#master-2"}; 17:37:45 Loading VCS changes for "CMLS Root" {instance id=321, parent internal id=321, parent id=CMLS_Root, description: "https://gitblit.cid-dev.net/gitblit-0.9.2/git/CMLS/CMLS.Classifiers.NaiveBayes.git#master-2"}; VCS Periodical executor 6"
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(Unknown Source)
at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(Unknown Source)
at java.util.concurrent.locks.ReentrantLock.lock(Unknown Source)
at sun.security.ssl.SSLSocketImpl.writeRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.writeRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.sendAlert(Unknown Source)
at sun.security.ssl.SSLSocketImpl.warning(Unknown Source)
at sun.security.ssl.SSLSocketImpl.closeInternal(Unknown Source)
at sun.security.ssl.SSLSocketImpl.close(Unknown Source)
at sun.security.ssl.BaseSSLSocketImpl.finalize(Unknown Source)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Unknown Source)
at java.lang.ref.Finalizer.access$100(Unknown Source)
at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)
"TC: 17:37:45 getCurrentState: "CMLS Root" {instance id=321, parent internal id=321, parent id=CMLS_Root, description: "https://gitblit.cid-dev.net/gitblit-0.9.2/git/CMLS/CMLS.Classifiers.NaiveBayes.git#master-2"}; 17:37:45 Loading VCS changes for "CMLS Root" {instance id=321, parent internal id=321, parent id=CMLS_Root, description: "https://gitblit.cid-dev.net/gitblit-0.9.2/git/CMLS/CMLS.Classifiers.NaiveBayes.git#master-2"}; VCS Periodical executor 6" group="main" prio=5 tid=104 nid=104 blocked on sun.security.ssl.SSLSocketImpl at eb5db2
by "Finalizer"
java.lang.Thread.State: BLOCKED
at sun.security.ssl.SSLSocketImpl.getConnectionState(Unknown Source)
at sun.security.ssl.SSLSocketImpl.isClosed(Unknown Source)
at java.net.Socket.getTcpNoDelay(Unknown Source)
at sun.security.ssl.BaseSSLSocketImpl.getTcpNoDelay(Unknown Source)
at sun.security.ssl.SSLSocketImpl.writeRecordInternal(Unknown Source)
at sun.security.ssl.SSLSocketImpl.writeRecord(Unknown Source)
at sun.security.ssl.AppOutputStream.write(Unknown Source)
at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
at java.io.BufferedOutputStream.flush(Unknown Source)
at java.io.PrintStream.flush(Unknown Source)
at sun.net.www.MessageHeader.print(Unknown Source)
at sun.net.www.http.HttpClient.writeRequests(Unknown Source)
at sun.net.www.http.HttpClient.writeRequests(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.writeRequests(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
at org.eclipse.jgit.util.HttpSupport.response(HttpSupport.java:167)
at org.eclipse.jgit.transport.TransportHttp.connect(TransportHttp.java:459)
at org.eclipse.jgit.transport.TransportHttp.openFetch(TransportHttp.java:305)
at jetbrains.buildServer.buildTriggers.vcs.git.GitVcsSupport.getRemoteRefs(GitVcsSupport.java:472)
at jetbrains.buildServer.buildTriggers.vcs.git.GitVcsSupport.getRemoteRefs(GitVcsSupport.java:454)
at jetbrains.buildServer.buildTriggers.vcs.git.GitVcsSupport.getCurrentState(GitVcsSupport.java:125)
at jetbrains.buildServer.buildTriggers.vcs.git.GitCollectChangesPolicy.getCurrentState(GitCollectChangesPolicy.java:176)
at jetbrains.vcs.api.services.impl.RepositoryStateServiceProvider$1.getCurrentState(RepositoryStateServiceProvider.java:9)
at jetbrains.buildServer.vcs.impl.VcsRootInstanceImpl.getCurrentState(VcsRootInstanceImpl.java:117)
at jetbrains.buildServer.vcs.impl.VcsChangesLoaderImpl.getCurrentState(VcsChangesLoaderImpl.java:21)
at jetbrains.buildServer.vcs.impl.VcsChangesLoaderImpl.access$200(VcsChangesLoaderImpl.java:290)
at jetbrains.buildServer.vcs.impl.VcsChangesLoaderImpl$6.run(VcsChangesLoaderImpl.java:8)
at jetbrains.buildServer.util.NamedThreadFactory.executeWithNewThreadName(NamedThreadFactory.java:103)
at jetbrains.buildServer.vcs.impl.VcsChangesLoaderImpl.doCollectStates(VcsChangesLoaderImpl.java:54)
at jetbrains.buildServer.vcs.impl.VcsChangesLoaderImpl.collectStatesForAllRoots(VcsChangesLoaderImpl.java:220)
at jetbrains.buildServer.vcs.impl.VcsChangesLoaderImpl.getLoadChangesIntervals(VcsChangesLoaderImpl.java:7)
at jetbrains.buildServer.vcs.impl.VcsChangesLoaderImpl.loadChangesNoLocking(VcsChangesLoaderImpl.java:288)
at jetbrains.buildServer.vcs.impl.VcsChangesLoaderImpl.tryLoadChanges(VcsChangesLoaderImpl.java:33)
at jetbrains.buildServer.serverSide.impl.VcsModificationChecker$1$1.run(VcsModificationChecker.java:12)
at jetbrains.buildServer.util.NamedThreadFactory.executeWithNewThreadName(NamedThreadFactory.java:103)
at jetbrains.buildServer.serverSide.impl.VcsModificationChecker$1.run(VcsModificationChecker.java:3)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Has anyone seen something like this? The problem reproduces every 1-3
hours with jdk 1.7.0_21 and once a day with jdk 1.7.0_40. I know that
deadlock has been fixed, but isn't it strange that live Socket is
finalized?
--
Dmitry Neverov
JetBrains
http://www.jetbrains.com
"Develop with pleasure!"
More information about the security-dev
mailing list