tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Doug Herbert <dougy_herb...@yahoo.com>
Subject Fragmented delivery of servlet request
Date Fri, 09 Apr 2010 03:09:32 GMT
Thoughts welcomed on the following problem :

Centos 5.4, http 2.2.3, tomcat5-5.5.23-0jpp.7.el5_3.2, java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5


A large servlet request, POST'ed from client to apache, connected using proxy_ajp to ajp://localhost:8009.

reassembled on server eth0 as 10766 bytes but only partially sent to tomcat. Th eth0 line
trace to http ( port 80 ) was split over 19 packets of 536 bytes each.

My initial thoughts were, that maxHttpHeaderSize=8192, was too low. Increasing to 16384 did
not resolve the issue.

So more wireshark line traces, ( one tcpdump across eth0 capturing the http POST and a 2nd
tcpdump across loopback capturing ajp connector traffic ) revealed, that apache via connector
ajp delivered each packet realtime time to tomcat, without waiting for all 10766 bytes to
arrive, though the trace across loopback on port 8009, revealed that tomcat starting the reply
before all 10766 bytes had arrived. 

tcpdump on eth0 confirmed, by reassembled tcp segment to contained the 10766 bytes from the
browser client.

( Note : I have mangled URI SRV referer host headers )

Apache JServ Protocol v1.3
    Magic: 1234
    Length: 528
    Code: (2) FORWARD REQUEST
    Method: (4) POST
    Version: HTTP/1.1
    URI: /xxxx/yyyyy
    RADDR: 192.168.252.68
    RHOST: 
    SRV: xxxyyyy
    PORT: 80
    SSLP: 0
    NHDR: 11
    accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash,
application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
    referer: http://xxxxyyyy
    accept-language: en-us
    content-type: application/x-www-form-urlencoded
    UA-CPU: x86
    accept-encoding: gzip, deflate
    user-agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
    host: xxxyyyy
    content-length: 10766
    connection: Keep-Alive
    Cache-Control: no-cache


My question is, why did tomcat start to send the RSP ( response ) after only receiving the
first data packet from ajp connector, around 500 bytes, when the above states the content
length is 10766 bytes. You can also see that subsequent REQ ( request body ) data packets
are still transmitted to tomcat, though the response is already being returned. 

Another option I thought of, was to buffer the whole 10766 bytes up on the apache side, and
then get the connector to pass the request across as one 'big' packet. Is this possible to
configure ? If so, then maxHttpHeaderSize will come into play, though at the moment only many
small packets are being sent across in the fragmented request.

A stack dump in catalina.out can be seen below, where the input filter is balking on the POSTed
parameters, most likely because only 550 bytes of the 10766, have turned up for the input
filter to process.

Apr 9, 2010 10:51:55 AM org.apache.catalina.connector.Request parseParameters
WARNING: Exception thrown whilst processing POSTed parameters
java.io.IOException: Socket read failed
        at org.apache.coyote.ajp.AjpAprProcessor.read(AjpAprProcessor.java:1038)
        at org.apache.coyote.ajp.AjpAprProcessor.readMessage(AjpAprProcessor.java:1159)
        at org.apache.coyote.ajp.AjpAprProcessor.receive(AjpAprProcessor.java:1091)
        at org.apache.coyote.ajp.AjpAprProcessor.refillReadBuffer(AjpAprProcessor.java:1130)
        at org.apache.coyote.ajp.AjpAprProcessor.access$0(AjpAprProcessor.java:1115)
        at org.apache.coyote.ajp.AjpAprProcessor$SocketInputBuffer.doRead(AjpAprProcessor.java:1233)
        at org.apache.coyote.Request.doRead(Request.java:419)
        at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:265)
        at org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:403)
        at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:280)
        at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:193)
        at org.apache.catalina.connector.Request.readPostBody(Request.java:2419)
        at org.apache.catalina.connector.Request.parseParameters(Request.java:2398)
        at org.apache.catalina.connector.Request.getParameter(Request.java:1005)
        at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:353)
        at com.xxxx.yyyyy.filters.RequestValidation.getParameter(RequestValidation.java:40)
        at com.xxxx.yyyy.zzzzz.service(zzzzz.java:157)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at com.xxxx.yyyy.filters.RequestFilter.doFilter(RequestFilter.java:16)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
        at org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:444)





No.     Time            Source                SrcPort Destination           DPort  Protocol
Info
    731 10:24:51.406434 127.0.0.1             46704   127.0.0.1             8009   AJP13 
  0:REQ:POST /xxxx/yyyy HTTP/1.1
    732 10:24:51.406452 127.0.0.1             46704   127.0.0.1             8009   AJP13 
  0:REQ:Body
    733 10:24:51.408554 127.0.0.1             8009    127.0.0.1             46704  TCP   
  8009 > 46704 [ACK] Seq=273919 Ack=8041 Win=386 Len=0 TSV=192177833 TSER=192177830
    734 10:24:51.408730 127.0.0.1             8009    127.0.0.1             46704  AJP13 
  0:RSP:GET BODY CHUNK
    735 10:24:51.408737 127.0.0.1             46704   127.0.0.1             8009   TCP   
  46704 > 8009 [ACK] Seq=8041 Ack=273926 Win=2440 Len=0 TSV=192177833 TSER=192177833
    742 10:24:51.460670 127.0.0.1             46704   127.0.0.1             8009   AJP13 
  0:REQ:Body
    743 10:24:51.460728 127.0.0.1             8009    127.0.0.1             46704  AJP13 
  0:RSP:GET BODY CHUNK
    767 10:24:51.500813 127.0.0.1             46704   127.0.0.1             8009   TCP   
  46704 > 8009 [ACK] Seq=8583 Ack=273933 Win=2441 Len=0 TSV=192177925 TSER=192177885
    768 10:24:51.562298 127.0.0.1             8009    127.0.0.1             46704  AJP13 
  0:RSP:SEND BODY CHUNK
    769 10:24:51.562316 127.0.0.1             46704   127.0.0.1             8009   TCP   
  46704 > 8009 [ACK] Seq=8583 Ack=282304 Win=2389 Len=0 TSV=192177986 TSER=192177986
    770 10:24:51.562662 127.0.0.1             8009    127.0.0.1             46704  AJP13 
  0:RSP:SEND BODY CHUNK
    771 10:24:51.562670 127.0.0.1             46704   127.0.0.1             8009   TCP   
  46704 > 8009 [ACK] Seq=8583 Ack=298688 Win=2291 Len=0 TSV=192177987 TSER=192177987
    772 10:24:51.581234 127.0.0.1             8009    127.0.0.1             46704  AJP13 
  0:RSP:END RESPONSE
    773 10:24:51.581243 127.0.0.1             46704   127.0.0.1             8009   TCP   
  46704 > 8009 [ACK] Seq=8583 Ack=307526 Win=2236 Len=0 TSV=192178005 TSER=192178005
    783 10:24:51.700763 127.0.0.1             46704   127.0.0.1             8009   AJP13 
  0:REQ:Body
    784 10:24:51.701186 127.0.0.1             8009    127.0.0.1             46704  AJP13 
  0:RSP:END RESPONSE
    785 10:24:51.701194 127.0.0.1             46704   127.0.0.1             8009   TCP   
  46704 > 8009 [ACK] Seq=9125 Ack=307555 Win=2417 Len=0 TSV=192178125 TSER=192178125




      

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


Mime
View raw message