Index: java/org/apache/catalina/connector/CoyoteAdapter.java =================================================================== --- java/org/apache/catalina/connector/CoyoteAdapter.java (revision 1060981) +++ java/org/apache/catalina/connector/CoyoteAdapter.java (working copy) @@ -331,8 +331,9 @@ req.getRequestProcessor().setWorkerThreadName(null); // Recycle the wrapper request and response if (!comet) { + // Recycle response first, so that errors while recycling request won't prevent recycle of response + response.recycle(); request.recycle(); - response.recycle(); } else { // Clear converters so that the minimum amount of memory // is used by this processor Index: java/org/apache/catalina/connector/Request.java =================================================================== --- java/org/apache/catalina/connector/Request.java (revision 1060981) +++ java/org/apache/catalina/connector/Request.java (working copy) @@ -427,9 +427,9 @@ notes.clear(); cookies = null; - if (session != null) { - session.endAccess(); - } + // Hold the session object in temp for processing at the end so that any errors won't prevent + // clean recycle of the request object. + Session tempSession = session; session = null; requestedSessionCookie = false; requestedSessionId = null; @@ -458,6 +458,10 @@ reader = null; } } + // Do session related processing at the end so that any errors won't prevent clean recycle of request object. + if (tempSession != null) { + tempSession.endAccess(); + } }