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