tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Filip Hanik - Dev Lists <devli...@hanik.com>
Subject Re: soTimeout not worked on channelNioSocket
Date Mon, 08 Oct 2007 16:03:33 GMT
I haven't seen any work done on the NIO part of AJP in a very long time, 
so what I would suggest you do is

1. submit a bug report at 
http://issues.apache.org/bugzilla/enter_bug.cgi?product=Tomcat%206
2. If possible, provide a patch

Filip

William Leung wrote:
> I have configuared tomcat to use the NIO impl over AJP, here are the lines in
> server.xml 
>     <Connector address="127.0.0.1" port="0" 
>
>                channelNioSocket.port="8009" 
>                channelNioSocket.soTimeout="600000" 
>                channelNioSocket.bufferSize="16384" 
>                channelNioSocket.maxThreads="125" 
>                channelNioSocket.minSpareThreads="10" 
>                channelNioSocket.maxSpareThreads="50" 
>
>                redirectPort="8443" protocol="AJP/1.3" 
>                useBodyEncodingForURI="true" 
>                /> 
>
> (TC version 5.5.17) 
> I had setted the soTimeout with 10 minutes, cause I notice such stages in
> server status 
>
> Stage Time B Sent B Recv Client VHost Request 
> S 33280840 ms 359 KB 0 KB x.x.x.x 127.0.0.1 GET ... 
>
> That shows several requests were blocking on reading request bodies for
> hours. 
>
> But unfortunately it dosen't worked for me, I am expecting a request should
> only blocking mostly 10 minutes on read, after that a SocketTimeoutException
> should raised. 
>
> After digest the source code of ChannelNioSocket.java, I found that
> ChannelNioSocket.SocketInputStream just wait infinitly if no data comes
> while socket could not be detected closing 
>
>         private void block(int len) throws IOException { 
>             ... ... 
>             if(!dataAvailable) { 
>                 blocking = true; 
>                 if(log.isDebugEnabled()) 
>                     log.debug("Waiting for "+len+" bytes to be available"); 
>                 try{ 
>                     wait(socketTimeout); 
>                 }catch(InterruptedException iex) { 
>                     log.debug("Interrupted",iex); 
>                 } 
>                 blocking = false; 
>             } 
>             if(dataAvailable) { 
>                 dataAvailable = false; 
>                 if(fill(len) < 0) { 
>                     isClosed = true; 
>                 } 
>             } 
>         } 
>
> The socketTimeout parameter is not used to throw SocketTimeoutException,
> actually it has no meaning. 
>
> I even read the source for TC 6.0.13, the same as above. 
>
> Should it be more precisely that throwing SocketTimeoutException on later
> condiction test for (dataAvailable) is not true? 
>
> In ChannelSocket implement, the problem is not exists,  it uses blocking
> Socket.getInputStream, and it would throws SocketTimeoutException for socket
> timeout while Socket.setSoTimeout was called
>
>   


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


Mime
View raw message