https://issues.apache.org/bugzilla/show_bug.cgi?id=56995
Bug ID: 56995 Summary: Errors from servlet writer flush() causing threads in BLOCK state Product: Tomcat 7 Version: 7.0.55 Hardware: All OS: Linux Status: NEW Severity: normal Priority: P2 Component: Connectors Assignee: dev@tomcat.apache.org Reporter: charles...@yahoo.com We are using tomcat 7.0.55 with bio connector. We are seeing threads go into bad BLOCKED state when client's throw IOException when trying to flush and the process tries to call setErrorState which then calls processSocketAsync. But processSocketAsync waits to hold a lock on the socket which previously held by the processor. Below is part of the stacktrace where it shows this. "http-bio-0.0.0.0-8042-exec-35" daemon prio=10 tid=0x0000000003647000 nid=0x3605 waiting on condition [0x00007f0e02d8c000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x000000073d3d20b0> (a com.google.common.util.concurrent.AbstractFuture$Sync) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834) at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:994) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1303) at com.google.common.util.concurrent.AbstractFuture$Sync.get(AbstractFuture.java:285) at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:116) at com.yahoo.yql.plus.writer.ResultEnvelope.processResults(ResultEnvelope.java:140) at com.yahoo.yql.plus.writer.ResultEnvelope.write(ResultEnvelope.java:64) at com.yahoo.yql.plus.writer.ResultEnvelope.write(ResultEnvelope.java:57) at com.yahoo.yql.plus.ProgramEngine.write(ProgramEngine.java:247) at com.yahoo.yql.plus.ProgramEngine.execute(ProgramEngine.java:221) at com.yahoo.yql.plus.ProgramEngine.execute(ProgramEngine.java:263) at com.yahoo.yql.core.Container.executeProgramRequest(Container.java:340) at com.yahoo.yql.container.servlet.filter.DispatchFilter.doFilter(DispatchFilter.java:154) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at yjava.servlet.FilterChainInvoker$ServletFilterChainInvoker.invoke(FilterChainInvoker.java:49) at yjava.servlet.filter.YHdrsFilter.doFilter(YHdrsFilter.java:69) at yjava.servlet.filter.YHdrsFilter.doFilter(YHdrsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at yjava.servlet.FilterChainInvoker$ServletFilterChainInvoker.invoke(FilterChainInvoker.java:49) at yjava.cookie.CookieDataFilter.doFilter(CookieDataFilter.java:135) at yjava.cookie.CookieDataFilter.doFilter(CookieDataFilter.java:111) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at yjava.servlet.FilterChainInvoker$ServletFilterChainInvoker.invoke(FilterChainInvoker.java:49) at yjava.servlet.filter.SSLCrimeFilter.doFilter(SSLCrimeFilter.java:82) at yjava.servlet.filter.SSLCrimeFilter.doFilter(SSLCrimeFilter.java:47) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at yjava.servlet.FilterChainInvoker$ServletFilterChainInvoker.invoke(FilterChainInvoker.java:49) at yjava.servlet.filter.DoNotTrackFilter.doFilter(DoNotTrackFilter.java:110) at yjava.servlet.filter.DoNotTrackFilter.doFilter(DoNotTrackFilter.java:50) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at yjava.servlet.FilterChainInvoker$ServletFilterChainInvoker.invoke(FilterChainInvoker.java:49) at yjava.remote.ip.RemoteIPFilter.doFilter(RemoteIPFilter.java:104) at yjava.remote.ip.RemoteIPFilter.doFilter(RemoteIPFilter.java:65) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at yjava.servlet.FilterChainInvoker$ServletFilterChainInvoker.invoke(FilterChainInvoker.java:49) at yjava.security.yiv.servlet.InputValidationFilter.doFilter(InputValidationFilter.java:244) at yjava.security.yiv.servlet.InputValidationFilter.doFilter(InputValidationFilter.java:151) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at yjava.servlet.FilterChainInvoker$ServletFilterChainInvoker.invoke(FilterChainInvoker.java:49) at yjava.servlet.filter.StatsFilter.doFilter(StatsFilter.java:90) at yjava.servlet.filter.StatsFilter.doFilter(StatsFilter.java:65) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at com.yahoo.yjava.AccessLogValveCopy.invoke(AccessLogValveCopy.java:580) at yjava.tomcat.valves.YahooConnectionValve.invoke(YahooConnectionValve.java:141) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) - locked <0x000000073cff7db0> (a org.apache.tomcat.util.net.SocketWrapper) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:724) This is a thread that throws IOException and waiting to get hold of lock on the socket which is privioulsy held by above http-bio thread. "work-7907" daemon prio=10 tid=0x0000000004b26800 nid=0x3a16 waiting for monitor entry [0x00007f0d8116b000] java.lang.Thread.State: BLOCKED (on object monitor) at org.apache.tomcat.util.net.JIoEndpoint.processSocketAsync(JIoEndpoint.java:560) - waiting to lock <0x000000073cff7db0> (a org.apache.tomcat.util.net.SocketWrapper) at org.apache.coyote.AbstractProcessor.setErrorState(AbstractProcessor.java:84) at org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:802) at org.apache.coyote.Response.action(Response.java:172) at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:363) at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:331) at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:101) at java.io.PrintStream.flush(PrintStream.java:338) - locked <0x000000073cff7e10> (a java.io.PrintStream) at com.yahoo.media.yql.lib.listener.ProtoSerializer.writeMessagePart(ProtoSerializer.java:77) at com.yahoo.media.yql.lib.listener.ProtoSerializer.onResultSuccess(ProtoSerializer.java:59) at com.yahoo.yql.plus.writer.ResultEnvelope$YQLResultCallback.onSuccess(ResultEnvelope.java:192) - locked <0x000000073cff7e50> (a com.yahoo.yql.plus.ProgramResponseImpl) at com.yahoo.yql.plus.writer.ResultEnvelope$YQLResultCallback.onSuccess(ResultEnvelope.java:146) at com.google.common.util.concurrent.Futures$4.run(Futures.java:1169) at com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:297) at com.google.common.util.concurrent.ExecutionList.executeListener(ExecutionList.java:156) at com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:145) at com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:185) at com.google.common.util.concurrent.Futures$ChainingListenableFuture$1.run(Futures.java:860) at com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:297) at com.google.common.util.concurrent.Futures$ImmediateFuture.addListener(Futures.java:100) at com.google.common.util.concurrent.Futures$ChainingListenableFuture.run(Futures.java:856) at com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:297) at com.yahoo.yqlplus.engine.internal.scope.ExecutionScoper$1.execute(ExecutionScoper.java:99) at com.google.common.util.concurrent.ExecutionList.executeListener(ExecutionList.java:156) at com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:145) at com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:185) at com.google.common.util.concurrent.SettableFuture.set(SettableFuture.java:53) at com.yahoo.yqlplus.engine.internal.java.runtime.TimeoutHandler$3.onSuccess(TimeoutHandler.java:100) at com.google.common.util.concurrent.Futures$4.run(Futures.java:1169) at com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:297) at com.google.common.util.concurrent.ExecutionList.executeListener(ExecutionList.java:156) at com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:145) at com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:185) at com.google.common.util.concurrent.SettableFuture.set(SettableFuture.java:53) at com.yahoo.yqlplus.engine.internal.programs.Program62219060_b47e_42cb_b726_b87eaabec462.task_109(Program62219060_b47e_42cb_b726_b87eaabec462.java) at java.lang.invoke.LambdaForm$DMH/33003170.invokeSpecial_L_V(LambdaForm$DMH) at java.lang.invoke.LambdaForm$BMH/1542947881.reinvoke(LambdaForm$BMH) at java.lang.invoke.LambdaForm$MH/1589590023.exactInvoker(LambdaForm$MH) at java.lang.invoke.LambdaForm$MH/1744671065.exactInvoker(LambdaForm$MH) at java.lang.invoke.LambdaForm$MH/1579626491.collect(LambdaForm$MH) at java.lang.invoke.LambdaForm$MH/284451544.invoke_MT(LambdaForm$MH) at com.yahoo.yqlplus.engine.internal.java.functions.MethodHandleRunnable.run(MethodHandleRunnable.java:19) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at com.yahoo.yqlplus.engine.internal.scope.ExecutionScoper$2.run(ExecutionScoper.java:113) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:724) -- You are receiving this mail because: You are the assignee for the bug. --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org