Author: markt Date: Thu Sep 30 17:35:35 2010 New Revision: 1003177 URL: http://svn.apache.org/viewvc?rev=1003177&view=rev Log: Fix the root cause of the previous TCK failures (badly re-factored flush()) and restore the changes that were just working around the symptoms (poller stuff). Servlet 3.0 passes for the AJP/APR connector as of this commit.
Modified: tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java Modified: tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java?rev=1003177&r1=1003176&r2=1003177&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java Thu Sep 30 17:35:35 2010 @@ -233,7 +233,7 @@ public abstract class AbstractAjpProcess } try { - flush(); + flush(false); } catch (IOException e) { // Set error flag error = true; @@ -253,7 +253,7 @@ public abstract class AbstractAjpProcess } try { - flush(); + flush(true); } catch (IOException e) { // Set error flag error = true; @@ -358,7 +358,7 @@ public abstract class AbstractAjpProcess // Methods called by action() protected abstract void actionInternal(ActionCode actionCode, Object param); - protected abstract void flush() throws IOException; + protected abstract void flush(boolean tbd) throws IOException; protected abstract void finish() throws IOException; Modified: tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java?rev=1003177&r1=1003176&r2=1003177&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java Thu Sep 30 17:35:35 2010 @@ -319,6 +319,13 @@ public class AjpAprProcessor extends Abs } + // Add the socket to the poller + if (!error && !endpoint.isPaused()) { + if (!isAsync()) { + ((AprEndpoint)endpoint).getPoller().add(socketRef); + } + } + rp.setStage(org.apache.coyote.Constants.STAGE_ENDED); if (error || endpoint.isPaused()) { @@ -451,10 +458,10 @@ public class AjpAprProcessor extends Abs // Add the end message if (outputBuffer.position() + endMessageArray.length > outputBuffer.capacity()) { - flush(); + flush(false); } outputBuffer.put(endMessageArray); - flush(); + flush(false); } @@ -645,7 +652,7 @@ public class AjpAprProcessor extends Abs * Callback to write data from the buffer. */ @Override - protected void flush() throws IOException { + protected void flush(boolean explicit) throws IOException { long socketRef = socket.getSocket().longValue(); @@ -656,11 +663,12 @@ public class AjpAprProcessor extends Abs outputBuffer.clear(); } // Send explicit flush message - if (Socket.sendb(socketRef, flushMessageBuffer, 0, - flushMessageBuffer.position()) < 0) { - throw new IOException(sm.getString("ajpprocessor.failedflush")); + if (explicit) { + if (Socket.sendb(socketRef, flushMessageBuffer, 0, + flushMessageBuffer.position()) < 0) { + throw new IOException(sm.getString("ajpprocessor.failedflush")); + } } - } @@ -705,7 +713,7 @@ public class AjpAprProcessor extends Abs len -= thisTime; if (outputBuffer.position() + thisTime + Constants.H_SIZE + 4 > outputBuffer.capacity()) { - flush(); + flush(false); } outputBuffer.put((byte) 0x41); outputBuffer.put((byte) 0x42); Modified: tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java?rev=1003177&r1=1003176&r2=1003177&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java Thu Sep 30 17:35:35 2010 @@ -481,9 +481,9 @@ public class AjpAprProtocol if (state != SocketState.LONG && state != SocketState.ASYNC_END) { connections.remove(socket); recycledProcessors.offer(result); - //if (state == SocketState.OPEN) { - // proto.endpoint.getPoller().add(socket.getSocket().longValue()); - //} + if (state == SocketState.OPEN) { + proto.endpoint.getPoller().add(socket.getSocket().longValue()); + } } } } Modified: tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java?rev=1003177&r1=1003176&r2=1003177&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java Thu Sep 30 17:35:35 2010 @@ -577,7 +577,7 @@ public class AjpProcessor extends Abstra * Callback to write data from the buffer. */ @Override - protected void flush() throws IOException { + protected void flush(boolean explicit) throws IOException { // Send the flush message output.write(flushMessageArray); } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org