https://issues.apache.org/bugzilla/show_bug.cgi?id=51298

             Bug #: 51298
           Summary: throw SocketException when tomcat deal large(300 or
                    600) concurrent dpwnload file request
           Product: Tomcat 6
           Version: 6.0.28
          Platform: PC
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Connectors
        AssignedTo: dev@tomcat.apache.org
        ReportedBy: amosl...@gmail.com
    Classification: Unclassified


Environment:
OS:windows2008, JDK:1.6 Tomcat:6.0.28

How to reproduce it:
(1)We have a server running in tomcat.
(2)We have a servlet to write file into HttpServletResponse, key code is like
this:

OutputStream output = resp.getOutputStream(); //get response outputstream
... ...
output.write(b, 0, len); // write some file into it, client will receive it

(3)Use LoadRunner(Stress testing tool) simulate 300 concurrent HttpRequest,
when server received these requests, should write 10M's file content into the
response.
But, not all request can successfully, some of it disconnected when write file
into response.

I use log4j record exception like this:

ClientAbortException:  java.net.SocketException: Connection reset by peer:
socket write error
    at
org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:358)
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:323)
    at
org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:381)
    at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:370)
    at
org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89)
    at
com.dt.puppet.dp.view.PuppetDownloadView.render(PuppetDownloadView.java:92)
    at
org.nutz.mvc.invoker.ActionInvokerImpl.invoke(ActionInvokerImpl.java:269)
    at org.nutz.mvc.ActionInvoking.invoke(ActionInvoking.java:37)
    at org.nutz.mvc.NutMvcContent.handle(NutMvcContent.java:81)
    at org.nutz.mvc.NutFilter.doFilter(NutFilter.java:57)
    at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
    at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Connection reset by peer: socket write
error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(Unknown Source)
    at java.net.SocketOutputStream.write(Unknown Source)
    at
org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:741)
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:432)
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:347)
    at
org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:765)
    at
org.apache.coyote.http11.filters.IdentityOutputFilter.doWrite(IdentityOutputFilter.java:127)
    at
org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:574)
    at org.apache.coyote.Response.doWrite(Response.java:560)
    at
org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:353)
    ... 21 more


(4) Here is the server.xml, you can see the parameter:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Server port="8005" shutdown="SHUTDOWN">
<GlobalNamingResources>
<Resource auth="Container" description="User database that can be updated and
saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
name="UserDatabase" pathname="conf/tomcat-users.xml"
type="org.apache.catalina.UserDatabase"/>
</GlobalNamingResources>
<Service>
<Connector URIEncoding="UTF-8" acceptCount="1000" connectionTimeout="30000"
disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192"
maxPostSize="0" maxSpareThreads="75" maxThreads="1500" minSpareThreads="25"
port="80" protocol="HTTP/1.1" redirectport="8443"/>
<Engine defaultHost="localhost" name="Catalina">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
<Host appBase="webapps" autoDeploy="false" deployOnStartup="false"
name="localhost" xmlNamespaceAware="false" xmlValidation="false">
<Context cookies="false" docBase="WDM" path="/" reload="false"/>
</Host>
</Engine>
</Service>
</Server>


When find this exception, I adjust the Tomcat Connector parameter, add these
two parameter:
maxKeepAliveRequests="-1"  keepAliveTimeout=""(test many number)
But still have this problem.


So, Please tell me what I should do to avoid the exception when write something
to response.

-- 
Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- 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