tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From William Leung <...@21cn.com>
Subject soTimeout not worked on channelNioSocket
Date Mon, 08 Oct 2007 07:09:27 GMT

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

-- 
View this message in context: http://www.nabble.com/soTimeout-not-worked-on-channelNioSocket-tf4586319.html#a13091614
Sent from the Tomcat - Dev mailing list archive at Nabble.com.


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


Mime
View raw message