You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2010/11/16 18:22:45 UTC
svn commit: r1035701 - in /tomcat/trunk:
java/org/apache/catalina/session/ManagerBase.java
test/org/apache/catalina/session/Benchmarks.java
Author: markt
Date: Tue Nov 16 17:22:45 2010
New Revision: 1035701
URL: http://svn.apache.org/viewvc?rev=1035701&view=rev
Log:
Session manager performance
Switch to a queue of message digests rather than a single sync'd digest
Small improvement but is part of removing the sync completely that should result in larger improvements
Modified:
tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java
tomcat/trunk/test/org/apache/catalina/session/Benchmarks.java
Modified: tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java?rev=1035701&r1=1035700&r2=1035701&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java (original)
+++ tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java Tue Nov 16 17:22:45 2010
@@ -36,8 +36,10 @@ import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
+import java.util.Queue;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
import org.apache.catalina.Container;
import org.apache.catalina.Context;
@@ -99,7 +101,8 @@ public abstract class ManagerBase extend
* Return the MessageDigest implementation to be used when
* creating session identifiers.
*/
- protected MessageDigest digest = null;
+ protected Queue<MessageDigest> digests =
+ new ConcurrentLinkedQueue<MessageDigest>();
/**
@@ -341,33 +344,32 @@ public abstract class ManagerBase extend
* session identifiers. If none has been created yet, initialize
* one the first time this method is called.
*/
- public synchronized MessageDigest getDigest() {
+ protected MessageDigest createDigest() {
- if (this.digest == null) {
- long t1=System.currentTimeMillis();
- if (log.isDebugEnabled())
- log.debug(sm.getString("managerBase.getting", algorithm));
+ MessageDigest result;
+
+ long t1=System.currentTimeMillis();
+ if (log.isDebugEnabled())
+ log.debug(sm.getString("managerBase.getting", algorithm));
+ try {
+ result = MessageDigest.getInstance(algorithm);
+ } catch (NoSuchAlgorithmException e) {
+ log.error(sm.getString("managerBase.digest", algorithm), e);
try {
- this.digest = MessageDigest.getInstance(algorithm);
- } catch (NoSuchAlgorithmException e) {
- log.error(sm.getString("managerBase.digest", algorithm), e);
- try {
- this.digest = MessageDigest.getInstance(DEFAULT_ALGORITHM);
- } catch (NoSuchAlgorithmException f) {
- log.error(sm.getString("managerBase.digest",
- DEFAULT_ALGORITHM), e);
- this.digest = null;
- }
+ result = MessageDigest.getInstance(DEFAULT_ALGORITHM);
+ } catch (NoSuchAlgorithmException f) {
+ log.error(sm.getString("managerBase.digest",
+ DEFAULT_ALGORITHM), e);
+ result = null;
}
- if (log.isDebugEnabled())
- log.debug(sm.getString("managerBase.gotten"));
- long t2=System.currentTimeMillis();
- if( log.isDebugEnabled() )
- log.debug("getDigest() " + (t2-t1));
}
+ if (log.isDebugEnabled())
+ log.debug(sm.getString("managerBase.gotten"));
+ long t2=System.currentTimeMillis();
+ if( log.isDebugEnabled() )
+ log.debug("getDigest() " + (t2-t1));
- return (this.digest);
-
+ return result;
}
@@ -998,8 +1000,15 @@ public abstract class ManagerBase extend
while (resultLenBytes < this.sessionIdLength) {
synchronized (this) {
getRandomBytes(random);
- random = getDigest().digest(random);
}
+ MessageDigest md = digests.poll();
+ if (md == null) {
+ // If this fails, NPEs will follow. This should never fail
+ // since if it falls back to the default digest
+ md = createDigest();
+ }
+ random = md.digest(random);
+ digests.add(md);
for (int j = 0;
j < random.length && resultLenBytes < this.sessionIdLength;
j++) {
Modified: tomcat/trunk/test/org/apache/catalina/session/Benchmarks.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/session/Benchmarks.java?rev=1035701&r1=1035700&r2=1035701&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/session/Benchmarks.java (original)
+++ tomcat/trunk/test/org/apache/catalina/session/Benchmarks.java Tue Nov 16 17:22:45 2010
@@ -108,10 +108,10 @@ public class Benchmarks extends TestCase
/*
* Results on markt's 4-core dev box
- * 1 thread - ~2,400ms
- * 2 threads - ~4,700ms
- * 4 threads - ~12,600ms
- * 16 threads - ~53,700ms
+ * 1 thread - ~2,300ms
+ * 2 threads - ~4,600ms
+ * 4 threads - ~12,300ms
+ * 16 threads - ~51,000ms
*/
public void testManagerBaseCreateSession() {
doTestManagerBaseCreateSession(1, 100000);
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org