You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by bu...@apache.org on 2007/03/06 21:43:30 UTC

DO NOT REPLY [Bug 41772] - HttpServletResponse is already committed.

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG�
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=41772>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND�
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=41772


nathan.nelson@digitalbarista.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Severity|normal                      |minor
            Summary|Brand new                   |HttpServletResponse is
                   |HttpServletResponse is      |already committed.
                   |already committed.          |




------- Additional Comments From nathan.nelson@digitalbarista.com  2007-03-06 12:43 -------
So, sheepishly I admit that this is an application error, but I believe there's
still a weakness to be patched up.  

It relates back to the Java2D stuff I'm using.  After the following two lines:

ImageOutputStream out=ImageIO.createImageOutputStream(response.getOutputStream());
ImageIO.write(image,"png",out);
response.getOutputStream().flush();

I never closed ImageOutputStream.  Obviously an application error.  However, in
the catalina logs, I found this stack trace:

2007-03-05 07:00:01,167 [Finalizer] ERROR org.apache.jk.server.JkCoyoteHandler -
Error in action code
java.net.SocketException: Socket closed
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:99)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
        at org.apache.jk.common.ChannelSocket.send(ChannelSocket.java:506)
        at org.apache.jk.server.JkCoyoteHandler.appendHead(JkCoyoteHandler.java:401)
        at org.apache.jk.server.JkCoyoteHandler.action(JkCoyoteHandler.java:416)
        at org.apache.coyote.Response.action(Response.java:182)
        at org.apache.coyote.Response.sendHeaders(Response.java:374)
        at org.apache.coyote.tomcat5.OutputBuffer.doFlush(OutputBuffer.java:322)
        at org.apache.coyote.tomcat5.OutputBuffer.flush(OutputBuffer.java:298)
        at
org.apache.coyote.tomcat5.CoyoteOutputStream.flush(CoyoteOutputStream.java:85)
        at
javax.imageio.stream.FileCacheImageOutputStream.close(FileCacheImageOutputStream.java:194)
        at
javax.imageio.stream.ImageInputStreamImpl.finalize(ImageInputStreamImpl.java:850)
        at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
        at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
        at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)


During GC, that ImageOutputStream is trying to flush the response output stream.
 It seems like Tomcat recycles HttpServletResponse objects.  If this finalizer
is executed AFTER the Response object it references is recycled, the resulting
'flush()' would cause that Response object to become committed.  When a new
request then comes in to be handled by a thread with a now broken Response
object . . . well, there's where my error comes from.

I also believe this bug report relates directly to bug #37516.  Note that in the
example code provided in that bug, he ALSO does not close his image output
stream.  My apologies for duplicating a previous bug.

While I understand this is my application's bug, it seems that recycling
Response objects should be a bit more safe than it currently is.

-- 
Configure bugmail: http://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org