Author: markt Date: Thu Sep 3 19:58:03 2015 New Revision: 1701120 URL: http://svn.apache.org/r1701120 Log: Use a static cache of B2CConverter objects rather than a per request cache that gets cleared every time the request switches to async mode.
Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java tomcat/trunk/java/org/apache/catalina/connector/Request.java tomcat/trunk/java/org/apache/tomcat/util/buf/B2CConverter.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=1701120&r1=1701119&r2=1701120&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Thu Sep 3 19:58:03 2015 @@ -304,10 +304,6 @@ public class CoyoteAdapter implements Ad if (!success || !request.isAsync()) { request.recycle(); response.recycle(); - } else { - // Clear converters so that the minimum amount of memory - // is used by this processor - request.clearEncoders(); } } return success; @@ -404,13 +400,8 @@ public class CoyoteAdapter implements Ad if (!async || error.get()) { request.recycle(); response.recycle(); - } else { - // Clear converters so that the minimum amount of memory - // is used by this processor - request.clearEncoders(); } } - } Modified: tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java?rev=1701120&r1=1701119&r2=1701120&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java Thu Sep 3 19:58:03 2015 @@ -33,6 +33,7 @@ import org.apache.coyote.Request; import org.apache.tomcat.util.buf.B2CConverter; import org.apache.tomcat.util.buf.ByteChunk; import org.apache.tomcat.util.buf.CharChunk; +import org.apache.tomcat.util.collections.SynchronizedStack; import org.apache.tomcat.util.res.StringManager; /** @@ -52,9 +53,6 @@ public class InputBuffer extends Reader */ protected static final StringManager sm = StringManager.getManager(InputBuffer.class); - - // -------------------------------------------------------------- Constants - public static final int DEFAULT_BUFFER_SIZE = 8*1024; // The buffer can be used for byte[] and char[] reading @@ -64,6 +62,13 @@ public class InputBuffer extends Reader public final int BYTE_STATE = 2; + /** + * Encoder cache. + */ + private static final ConcurrentHashMap<Charset,SynchronizedStack<B2CConverter>> encoders = + new ConcurrentHashMap<>(); + + // ----------------------------------------------------- Instance Variables /** @@ -97,12 +102,6 @@ public class InputBuffer extends Reader /** - * List of encoders. - */ - protected final ConcurrentHashMap<Charset,B2CConverter> encoders = new ConcurrentHashMap<>(); - - - /** * Current byte to char converter. */ protected B2CConverter conv; @@ -197,6 +196,7 @@ public class InputBuffer extends Reader if (conv != null) { conv.recycle(); + encoders.get(conv.getCharset()).push(conv); conv = null; } @@ -205,14 +205,6 @@ public class InputBuffer extends Reader /** - * Clear cached encoders (to save memory for async requests). - */ - public void clearEncoders() { - encoders.clear(); - } - - - /** * Close the input buffer. * * @throws IOException An underlying IOException occurred @@ -370,9 +362,7 @@ public class InputBuffer extends Reader @Override public int realReadChars() throws IOException { - if (conv == null) { - setConverter(); - } + checkConverter(); boolean eof = false; @@ -545,7 +535,6 @@ public class InputBuffer extends Reader private void setConverter() throws IOException { - if (coyoteRequest != null) { enc = coyoteRequest.getCharacterEncoding(); } @@ -555,11 +544,16 @@ public class InputBuffer extends Reader } Charset charset = B2CConverter.getCharset(enc); - conv = encoders.get(charset); + SynchronizedStack<B2CConverter> stack = encoders.get(charset); + if (stack == null) { + stack = new SynchronizedStack<>(); + encoders.putIfAbsent(charset, stack); + stack = encoders.get(charset); + } + conv = stack.pop(); if (conv == null) { conv = createConverter(charset); - encoders.put(charset, conv); } } 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=1701120&r1=1701119&r2=1701120&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Thu Sep 3 19:58:03 2015 @@ -517,13 +517,6 @@ public class Request pathParameters.clear(); } - /** - * Clear cached encoders (to save memory for async requests). - */ - public void clearEncoders() { - inputBuffer.clearEncoders(); - } - // -------------------------------------------------------- Request Methods Modified: tomcat/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java?rev=1701120&r1=1701119&r2=1701120&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java Thu Sep 3 19:58:03 2015 @@ -198,4 +198,9 @@ public class B2CConverter { } } } + + + public Charset getCharset() { + return decoder.charset(); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org