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