[ 
https://issues.apache.org/jira/browse/XMLRPC-166?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jochen Wiedmann resolved XMLRPC-166.
------------------------------------

       Resolution: Fixed
    Fix Version/s: 3.1.2
         Assignee: Jochen Wiedmann

Applied, with minor modifications. Thank you!


> Misbehaving clients can hang ServletWebServer
> ---------------------------------------------
>
>                 Key: XMLRPC-166
>                 URL: https://issues.apache.org/jira/browse/XMLRPC-166
>             Project: XML-RPC
>          Issue Type: Bug
>    Affects Versions: 3.1.1
>            Reporter: Alan Burlison
>            Assignee: Jochen Wiedmann
>             Fix For: 3.1.2
>
>         Attachments: hang.patch
>
>
> We are using the ServletWebServer class, and we are getting occasional hangs, 
> where the listener thread gets stuck as follows:
> "XML-RPC Weblistener" prio=3 tid=0x089bd000 nid=0x15 runnable 
> [0xe22ce000..0xe22ceb60]
>    java.lang.Thread.State: RUNNABLE
>     at java.net.SocketInputStream.socketRead0(Native Method)
>     at java.net.SocketInputStream.read(SocketInputStream.java:129)
>     at 
> com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:293)
>     at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:331)
>     at 
> com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:789)
>     - locked <0xeb722510> (a java.lang.Object)
>     at 
> com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:746)
>     at 
> com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:75)
>     - locked <0xeb722838> (a com.sun.net.ssl.internal.ssl.AppInputStream)
>     at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
>     at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
>     - locked <0xeb72ae70> (a 
> org.apache.xmlrpc.webserver.HttpServletRequestImpl$1)
>     at 
> org.apache.xmlrpc.webserver.HttpServletRequestImpl$2.read(HttpServletRequestImpl.java:94)
>     at javax.servlet.ServletInputStream.readLine(ServletInputStream.java:94)
>     at 
> org.apache.xmlrpc.webserver.HttpServletRequestImpl.readLine(HttpServletRequestImpl.java:170)
>     at org.apache.xmlrpc.webserver.HttpServletRequestImpl. 
> (HttpServletRequestImpl.java:106)
>     at org.apache.xmlrpc.webserver.ServletConnection. 
> (ServletConnection.java:50)
>     at 
> org.apache.xmlrpc.webserver.ServletWebServer.newTask(ServletWebServer.java:145)
>     at org.apache.xmlrpc.webserver.WebServer.run(WebServer.java:335)
>     at java.lang.Thread.run(Thread.java:619)
> The problem is this: when an incoming connection comes in, a new 
> HttpServletRequestImpl object is created.  The constructor of that class 
> reads in the HTTP headers.  The problem with *that* is that the 
> HttpServletRequestImpl constructor runs in the same thread that accepts 
> incoming connections, so if it blocks for any reason (e.g. the client hangs) 
> it blocks the accept thread, which means that any new connections also hang.
> I'm therefore proposing that the reading of the HTTP headers be factored out 
> of the HttpServletRequestImpl constructor and into a new method that is 
> called from the 'run' method of the thread that handles the request.  That 
> way, a client that hangs will only hang the thread that is servicing it and 
> not the entire XML-RPC server.
> Can anyone think of any reasons why this might cause problems?  If not I'll 
> do the changes and submit a patch.
> I also note that Connection class does this:
>         // set read timeout to 30 seconds
>         socket.setSoTimeout (30000);
> That *should* mean that the maximum time a client can hang the server for is 
> 30 seconds, but by observation that's clearly not happening and needs further 
> investigation.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to