https://bz.apache.org/bugzilla/show_bug.cgi?id=57779

            Bug ID: 57779
           Summary: Deadlock if using separate thread to write to
                    ServletOutputStream
           Product: Tomcat 7
           Version: 7.0.59
          Hardware: All
                OS: All
            Status: NEW
          Severity: major
          Priority: P2
         Component: Connectors
          Assignee: dev@tomcat.apache.org
          Reporter: bock.mich...@telekom.de

If using a separate (non-container) thread to write to a ServletOutputStream, a
deadlock can occur, if an io-error occurs during write. For example, if the
client drops the connection.
This is caused by a synchronized operation on the the underlying socket-object.

The servlet handling thread is blocked, while waiting for the end of output
from the separate thread, and holds a lock on the socket-object:

"http-bio-25030-exec-10" daemon prio=10 tid=0x0000000001804800 nid=0x3fd0
waiting on condition [0x00007f767aeeb000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000c3b273b8> (a
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
 ...
 at
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
        - locked <0x00000000c38ef6d8> (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:745)


The separate thread trys to write, but an io-error occurs:

"Thread-13" daemon prio=10 tid=0x00007f767c5c8000 nid=0x3fda waiting for
monitor entry [0x00007f767a4e2000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at
org.apache.tomcat.util.net.JIoEndpoint.processSocketAsync(JIoEndpoint.java:560)
        - waiting to lock <0x00000000c38ef6d8> (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)

Now it trys to get a lock on the socket-object and both threads are blocked
forever.

In the former tomcat version we used (7.0.53) this was not an issue. I had a
look in the source code and saw that the failing code was invented later.

-- 
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

Reply via email to