Author: fhanik Date: Wed Nov 19 15:39:17 2008 New Revision: 719129 URL: http://svn.apache.org/viewvc?rev=719129&view=rev Log: Fix SEND_FILE bug, with Java NIO you can only change the key interest ops on the poller thread, so we have to make sure we fire off an event
Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java?rev=719129&r1=719128&r2=719129&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java Wed Nov 19 15:39:17 2008 @@ -921,7 +921,7 @@ sendfileData.keepAlive = keepAlive; SelectionKey key = socket.getIOChannel().keyFor(socket.getPoller().getSelector()); //do the first write on this thread, might as well - openSocket = socket.getPoller().processSendfile(key,ka,true); + openSocket = socket.getPoller().processSendfile(key,ka,true,true); break; } Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?rev=719129&r1=719128&r2=719129&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Wed Nov 19 15:39:17 2008 @@ -1547,7 +1547,7 @@ NioChannel channel = attachment.getChannel(); if (sk.isReadable() || sk.isWritable() ) { if ( attachment.getSendfileData() != null ) { - processSendfile(sk,attachment,true); + processSendfile(sk,attachment,true, false); } else if ( attachment.getComet() ) { //check if thread is available if ( isWorkerAvailable() ) { @@ -1592,7 +1592,7 @@ return result; } - public boolean processSendfile(SelectionKey sk, KeyAttachment attachment, boolean reg) { + public boolean processSendfile(SelectionKey sk, KeyAttachment attachment, boolean reg, boolean event) { try { //unreg(sk,attachment);//only do this if we do process send file on a separate thread SendfileData sd = attachment.getSendfileData(); @@ -1616,10 +1616,16 @@ } attachment.setSendfileData(null); if ( sd.keepAlive ) { - if (log.isDebugEnabled()) { - log.debug("Connection is keep alive, registering back for OP_READ"); + if (reg) { + if (log.isDebugEnabled()) { + log.debug("Connection is keep alive, registering back for OP_READ"); + } + if (event) { + this.add(attachment.getChannel(),SelectionKey.OP_READ); + } else { + reg(sk,attachment,SelectionKey.OP_READ); + } } - if (reg) reg(sk,attachment,SelectionKey.OP_READ); } else { if (log.isDebugEnabled()) { log.debug("Send file connection is being closed"); @@ -1630,11 +1636,14 @@ if (log.isDebugEnabled()) { log.debug("OP_WRITE for sendilfe:"+sd.fileName); } - - reg(sk,attachment,SelectionKey.OP_WRITE); + if (event) { + add(attachment.getChannel(),SelectionKey.OP_WRITE); + } else { + reg(sk,attachment,SelectionKey.OP_WRITE); + } } }catch ( IOException x ) { - if ( log.isDebugEnabled() ) log.warn("Unable to complete sendfile request:", x); + if ( log.isDebugEnabled() ) log.debug("Unable to complete sendfile request:", x); cancelledKey(sk,SocketStatus.ERROR,false); return false; }catch ( Throwable t ) { --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]