Author: fhanik Date: Sat Mar 27 01:50:13 2010 New Revision: 928120 URL: http://svn.apache.org/viewvc?rev=928120&view=rev Log: Add in some debug, what is causing some TCK failures is a request/response pair not being recycled properly
Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java tomcat/trunk/java/org/apache/catalina/connector/Request.java tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java tomcat/trunk/java/org/apache/coyote/http11/Http11Protocol.java Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java?rev=928120&r1=928119&r2=928120&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Sat Mar 27 01:50:13 2010 @@ -344,7 +344,7 @@ public class CoyoteAdapter implements Ad } finally { req.getRequestProcessor().setWorkerThreadName(null); // Recycle the wrapper request and response - if (!comet && !async) { + if (!success || (!comet && !async)) { request.recycle(); response.recycle(); } else { Modified: tomcat/trunk/java/org/apache/catalina/connector/Request.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Request.java?rev=928120&r1=928119&r2=928120&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Sat Mar 27 01:50:13 2010 @@ -490,6 +490,7 @@ public class Request asyncSupported = null; if (asyncContext!=null) asyncContext.recycle(); + asyncContext = null; } Modified: tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java?rev=928120&r1=928119&r2=928120&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java Sat Mar 27 01:50:13 2010 @@ -66,18 +66,22 @@ public class AsyncContextImpl implements private Request request; public AsyncContextImpl(Request request) { + if (log.isDebugEnabled()) { + log.debug("AsyncContext created["+request.getRequestURI()+"?"+request.getQueryString()+"]", new DebugException()); + } //TODO SERVLET3 - async this.request = request; } @Override public void complete() { + if (log.isDebugEnabled()) { + log.debug("AsyncContext Complete Called["+state.get()+"; "+request.getRequestURI()+"?"+request.getQueryString()+"]", new DebugException()); + } if (state.get()==AsyncState.COMPLETING) { //do nothing - } else if (state.compareAndSet(AsyncState.STARTED, AsyncState.COMPLETING)) { - // TODO SERVLET3 - async - doInternalComplete(false); - } else if (state.compareAndSet(AsyncState.DISPATCHED, AsyncState.COMPLETING)) { + } else if (state.compareAndSet(AsyncState.DISPATCHED, AsyncState.COMPLETING) || + state.compareAndSet(AsyncState.STARTED, AsyncState.COMPLETING)) { // TODO SERVLET3 - async AtomicBoolean dispatched = new AtomicBoolean(false); request.getCoyoteRequest().action(ActionCode.ACTION_ASYNC_COMPLETE,dispatched); @@ -104,12 +108,16 @@ public class AsyncContextImpl implements @Override public void dispatch(ServletContext context, String path) { + if (log.isDebugEnabled()) { + log.debug("AsyncContext Dispatch Called["+state.get()+"; "+path+"; "+request.getRequestURI()+"?"+request.getQueryString()+"]", new DebugException()); + } + // TODO SERVLET3 - async if (state.compareAndSet(AsyncState.STARTED, AsyncState.DISPATCHING) || state.compareAndSet(AsyncState.DISPATCHED, AsyncState.DISPATCHING)) { if (request.getAttribute(ASYNC_REQUEST_URI)==null) { - request.setAttribute(ASYNC_REQUEST_URI, request.getRequestURI()); + request.setAttribute(ASYNC_REQUEST_URI, request.getRequestURI()+"?"+request.getQueryString()); request.setAttribute(ASYNC_CONTEXT_PATH, request.getContextPath()); request.setAttribute(ASYNC_SERVLET_PATH, request.getServletPath()); request.setAttribute(ASYNC_QUERY_STRING, request.getQueryString()); @@ -166,6 +174,10 @@ public class AsyncContextImpl implements @Override public void start(final Runnable run) { + if (log.isDebugEnabled()) { + log.debug("AsyncContext Start Called["+state.get()+"; "+request.getRequestURI()+"?"+request.getQueryString()+"]", new DebugException()); + } + if (state.compareAndSet(AsyncState.STARTED, AsyncState.DISPATCHING) || state.compareAndSet(AsyncState.DISPATCHED, AsyncState.DISPATCHING)) { // TODO SERVLET3 - async @@ -386,5 +398,5 @@ public class AsyncContextImpl implements this.servletResponse = response; event = new AsyncEvent(this, request, response); } - + public static class DebugException extends Exception {} } Modified: tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java?rev=928120&r1=928119&r2=928120&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java (original) +++ tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java Sat Mar 27 01:50:13 2010 @@ -124,7 +124,7 @@ public class AccessLogValve extends Valv //------------------------------------------------------ Constructor public AccessLogValve() { - super(false); + super(true); } // ----------------------------------------------------- Instance Variables @@ -543,13 +543,24 @@ public class AccessLogValve extends Valv @Override public void invoke(Request request, Response response) throws IOException, ServletException { - + final String t1Name = AccessLogValve.class.getName()+".t1"; if (getState().isAvailable() && getEnabled()) { // Pass this request on to the next valve in our pipeline long t1 = System.currentTimeMillis(); + boolean asyncdispatch = request.isAsyncDispatching(); + if (!asyncdispatch) { + request.setAttribute(t1Name, new Long(t1)); + } getNext().invoke(request, response); + //we're not done with the request + if (request.isAsyncDispatching()) { + return; + } else if (asyncdispatch && request.getAttribute(t1Name)!=null) { + t1 = ((Long)request.getAttribute(t1Name)).longValue(); + } + long t2 = System.currentTimeMillis(); long time = t2 - t1; 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=928120&r1=928119&r2=928120&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java Sat Mar 27 01:50:13 2010 @@ -674,7 +674,7 @@ public class AjpProcessor implements Act dispatch.set(true); endpoint.processSocket(this.socket, SocketStatus.STOP); } else { - dispatch.set(true); + dispatch.set(false); } } else if (actionCode == ActionCode.ACTION_ASYNC_SETTIMEOUT) { //TODO SERVLET3 - async 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=928120&r1=928119&r2=928120&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java Sat Mar 27 01:50:13 2010 @@ -778,7 +778,7 @@ public class Http11NioProcessor extends dispatch.set(true); endpoint.processSocket(this.socket, SocketStatus.STOP, true); } else { - dispatch.set(true); + dispatch.set(false); } } else if (actionCode == ActionCode.ACTION_ASYNC_SETTIMEOUT) { //TODO SERVLET3 - async Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java?rev=928120&r1=928119&r2=928120&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java Sat Mar 27 01:50:13 2010 @@ -619,7 +619,7 @@ public class Http11Processor extends Abs dispatch.set(true); endpoint.processSocket(this.socket, SocketStatus.STOP); } else { - dispatch.set(true); + dispatch.set(false); } } else if (actionCode == ActionCode.ACTION_ASYNC_SETTIMEOUT) { //TODO SERVLET3 - async Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Protocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Protocol.java?rev=928120&r1=928119&r2=928120&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11Protocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11Protocol.java Sat Mar 27 01:50:13 2010 @@ -242,6 +242,7 @@ public class Http11Protocol extends Abst public SocketState process(SocketWrapper<Socket> socket, SocketStatus status) { Http11Processor processor = connections.remove(socket); + boolean recycle = true; try { if (processor == null) { processor = recycledProcessors.poll(); @@ -262,6 +263,7 @@ public class Http11Protocol extends Abst if (state == SocketState.LONG) { connections.put(socket, processor); socket.setAsync(true); + recycle = false; } else { connections.remove(socket); socket.setAsync(false); @@ -291,8 +293,10 @@ public class Http11Protocol extends Abst // if(proto.adapter != null) proto.adapter.recycle(); // processor.recycle(); - processor.action(ActionCode.ACTION_STOP, null); - recycledProcessors.offer(processor); + if (recycle) { + processor.action(ActionCode.ACTION_STOP, null); + recycledProcessors.offer(processor); + } } return SocketState.CLOSED; } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org