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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org