Author: markt Date: Sat Jun 18 13:41:17 2011 New Revision: 1137184 URL: http://svn.apache.org/viewvc?rev=1137184&view=rev Log: Connector re-factoring Align APR with BIO/NIO
Modified: tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java 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=1137184&r1=1137183&r2=1137184&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java Sat Jun 18 13:41:17 2011 @@ -129,31 +129,46 @@ public class AjpAprProtocol extends Abst recycledProcessors.clear(); } - // FIXME: Support for this could be added in AJP as well - @Override - public SocketState event(SocketWrapper<Long> socket, SocketStatus status) { - return SocketState.CLOSED; - } - @Override public SocketState process(SocketWrapper<Long> socket, SocketStatus status) { - AjpAprProcessor processor = recycledProcessors.poll(); + AjpAprProcessor processor = connections.remove(socket); + + socket.setAsync(false); + try { if (processor == null) { + processor = recycledProcessors.poll(); + } + if (processor == null) { processor = createProcessor(); } - SocketState state = processor.process(socket); + SocketState state = SocketState.CLOSED; + do { + if (processor.isAsync() || state == SocketState.ASYNC_END) { + state = processor.asyncDispatch(status); + } else { + state = processor.process(socket); + } + + if (processor.isAsync()) { + state = processor.asyncPostProcess(); + } + } while (state == SocketState.ASYNC_END); + if (state == SocketState.LONG) { - // Check if the post processing is going to change the state - state = processor.asyncPostProcess(); - } - if (state == SocketState.LONG || state == SocketState.ASYNC_END) { // Need to make socket available for next processing cycle // but no need for the poller connections.put(socket, processor); socket.setAsync(true); + } else if (state == SocketState.OPEN){ + // In keep-alive but between requests. OK to recycle + // processor. Continue to poll for the next request. + processor.recycle(); + recycledProcessors.offer(processor); + ((AprEndpoint)proto.endpoint).getPoller().add( + socket.getSocket().longValue()); } else { processor.recycle(); recycledProcessors.offer(processor); @@ -184,44 +199,6 @@ public class AjpAprProtocol extends Abst return SocketState.CLOSED; } - @Override - public SocketState asyncDispatch(SocketWrapper<Long> socket, SocketStatus status) { - - AjpAprProcessor processor = connections.get(socket); - - SocketState state = SocketState.CLOSED; - if (processor != null) { - // Call the appropriate event - try { - state = processor.asyncDispatch(status); - } - // Future developers: if you discover any other - // rare-but-nonfatal exceptions, catch them here, and log as - // debug. - catch (Throwable e) { - ExceptionUtils.handleThrowable(e); - // any other exception or error is odd. Here we log it - // with "ERROR" level, so it will show up even on - // less-than-verbose logs. - AjpAprProtocol.log.error - (sm.getString("ajpprotocol.proto.error"), e); - } finally { - if (state == SocketState.LONG && processor.isAsync()) { - state = processor.asyncPostProcess(); - } - if (state != SocketState.LONG && state != SocketState.ASYNC_END) { - connections.remove(socket); - processor.recycle(); - recycledProcessors.offer(processor); - if (state == SocketState.OPEN) { - ((AprEndpoint)proto.endpoint).getPoller().add(socket.getSocket().longValue()); - } - } - } - } - return state; - } - protected AjpAprProcessor createProcessor() { AjpAprProcessor processor = new AjpAprProcessor(proto.packetSize, (AprEndpoint)proto.endpoint); processor.setAdapter(proto.adapter); Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java?rev=1137184&r1=1137183&r2=1137184&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java Sat Jun 18 13:41:17 2011 @@ -212,82 +212,56 @@ public class Http11AprProtocol extends A } @Override - public SocketState event(SocketWrapper<Long> socket, SocketStatus status) { - Http11AprProcessor processor = connections.get(socket.getSocket()); - - SocketState state = SocketState.CLOSED; - if (processor != null) { - if (processor.comet) { - // Call the appropriate event - try { - state = processor.event(status); - } catch (java.net.SocketException e) { - // SocketExceptions are normal - Http11AprProtocol.log.debug(sm.getString( - "http11protocol.proto.socketexception.debug"), - e); - } catch (java.io.IOException e) { - // IOExceptions are normal - Http11AprProtocol.log.debug(sm.getString( - "http11protocol.proto.ioexception.debug"), e); - } - // Future developers: if you discover any other - // rare-but-nonfatal exceptions, catch them here, and log as - // above. - catch (Throwable e) { - ExceptionUtils.handleThrowable(e); - // any other exception or error is odd. Here we log it - // with "ERROR" level, so it will show up even on - // less-than-verbose logs. - Http11AprProtocol.log.error(sm.getString( - "http11protocol.proto.error"), e); - } finally { - if (state != SocketState.LONG) { - connections.remove(socket.getSocket()); - socket.setAsync(false); - processor.recycle(); - recycledProcessors.offer(processor); - if (state == SocketState.OPEN) { - ((AprEndpoint)proto.endpoint).getPoller().add(socket.getSocket().longValue()); - } - } else { - ((AprEndpoint)proto.endpoint).getCometPoller().add(socket.getSocket().longValue()); - } - } - } else if (processor.isAsync()) { - state = asyncDispatch(socket, status); - } - } - return state; - } - - @Override public SocketState process(SocketWrapper<Long> socket, SocketStatus status) { - Http11AprProcessor processor = recycledProcessors.poll(); + Http11AprProcessor processor = + connections.remove(socket.getSocket()); + + socket.setAsync(false); + try { if (processor == null) { + processor = recycledProcessors.poll(); + } + if (processor == null) { processor = createProcessor(); } - SocketState state = processor.process(socket); - if (state == SocketState.LONG) { + SocketState state = SocketState.CLOSED; + do { + if (processor.isAsync() || state == SocketState.ASYNC_END) { + state = processor.asyncDispatch(socket, status); + } else if (processor.comet) { + state = processor.event(status); + } else { + state = processor.process(socket); + } + if (processor.isAsync()) { - // Check if the post processing is going to change the state state = processor.asyncPostProcess(); } - } - if (state == SocketState.LONG || state == SocketState.ASYNC_END) { - // Need to make socket available for next processing cycle - // but no need for the poller + } while (state == SocketState.ASYNC_END); + + if (state == SocketState.LONG) { + // In the middle of processing a request/response. Keep the + // socket associated with the processor. connections.put(socket.getSocket(), processor); + if (processor.isAsync()) { socket.setAsync(true); } else if (processor.comet) { ((AprEndpoint) proto.endpoint).getCometPoller().add( socket.getSocket().longValue()); } + } else if (state == SocketState.OPEN){ + // In keep-alive but between requests. OK to recycle + // processor. Continue to poll for the next request. + processor.recycle(); + recycledProcessors.offer(processor); + ((AprEndpoint)proto.endpoint).getPoller().add( + socket.getSocket().longValue()); } else { + // Connection closed. OK to recycle the processor. processor.recycle(); recycledProcessors.offer(processor); } @@ -318,43 +292,6 @@ public class Http11AprProtocol extends A return SocketState.CLOSED; } - @Override - public SocketState asyncDispatch(SocketWrapper<Long> socket, SocketStatus status) { - Http11AprProcessor processor = connections.get(socket.getSocket()); - - SocketState state = SocketState.CLOSED; - if (processor != null) { - // Call the appropriate event - try { - state = processor.asyncDispatch(socket, status); - // Future developers: if you discover any rare-but-nonfatal - // exceptions, catch them here, and log as per {@link #event()} - // above. - } catch (Throwable e) { - ExceptionUtils.handleThrowable(e); - // any other exception or error is odd. Here we log it - // with "ERROR" level, so it will show up even on - // less-than-verbose logs. - Http11AprProtocol.log.error - (sm.getString("http11protocol.proto.error"), e); - } finally { - if (state == SocketState.LONG && processor.isAsync()) { - state = processor.asyncPostProcess(); - } - if (state != SocketState.LONG && state != SocketState.ASYNC_END) { - connections.remove(socket.getSocket()); - socket.setAsync(false); - processor.recycle(); - recycledProcessors.offer(processor); - if (state == SocketState.OPEN) { - ((AprEndpoint)proto.endpoint).getPoller().add(socket.getSocket().longValue()); - } - } - } - } - return state; - } - protected Http11AprProcessor createProcessor() { Http11AprProcessor processor = new Http11AprProcessor( proto.getMaxHttpHeaderSize(), (AprEndpoint)proto.endpoint, Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1137184&r1=1137183&r2=1137184&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Sat Jun 18 13:41:17 2011 @@ -1641,10 +1641,6 @@ public class AprEndpoint extends Abstrac public interface Handler extends AbstractEndpoint.Handler { public SocketState process(SocketWrapper<Long> socket, SocketStatus status); - public SocketState event(SocketWrapper<Long> socket, - SocketStatus status); - public SocketState asyncDispatch(SocketWrapper<Long> socket, - SocketStatus status); } @@ -1696,11 +1692,6 @@ public class AprEndpoint extends Abstrac if (socket.async) { waitingRequests.add(socket); } - } else if (state == Handler.SocketState.ASYNC_END) { - socket.access(); - SocketProcessor proc = - new SocketProcessor(socket, SocketStatus.OPEN); - getExecutor().execute(proc); } } } @@ -1734,7 +1725,7 @@ public class AprEndpoint extends Abstrac if (status == null) { state = handler.process(socket,SocketStatus.OPEN); } else { - state = handler.asyncDispatch(socket, status); + state = handler.process(socket, status); } if (state == Handler.SocketState.CLOSED) { // Close socket and pool @@ -1777,7 +1768,7 @@ public class AprEndpoint extends Abstrac public void run() { synchronized (socket) { // Process the request from this socket - Handler.SocketState state = handler.event(socket, status); + Handler.SocketState state = handler.process(socket, status); if (state == Handler.SocketState.CLOSED) { // Close socket and pool destroySocket(socket.getSocket().longValue()); --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org