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: [email protected]
For additional commands, e-mail: [email protected]