Author: brandonwilliams Date: Tue Jan 18 21:34:04 2011 New Revision: 1060587
URL: http://svn.apache.org/viewvc?rev=1060587&view=rev Log: Remove contention around MD5 generation in GuidGenerator. Patch by brandonwilliams, reviewed by Pavel Yaskevich for CASSANDRA-1977 Removed: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/utils/SafeMessageDigest.java Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/utils/GuidGenerator.java Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/utils/GuidGenerator.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/utils/GuidGenerator.java?rev=1060587&r1=1060586&r2=1060587&view=diff ============================================================================== --- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/utils/GuidGenerator.java (original) +++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/utils/GuidGenerator.java Tue Jan 18 21:34:04 2011 @@ -34,7 +34,21 @@ public class GuidGenerator { private static Random myRand; private static SecureRandom mySecureRand; private static String s_id; - private static SafeMessageDigest md5 = null; + private static final ThreadLocal<MessageDigest> localMessageDigest = new ThreadLocal<MessageDigest>() + { + @Override + protected MessageDigest initialValue() + { + try + { + return MessageDigest.getInstance("MD5"); + } + catch (NoSuchAlgorithmException e) + { + throw new AssertionError(e); + } + } + }; static { if (System.getProperty("java.security.egd") == null) { @@ -49,17 +63,8 @@ public class GuidGenerator { catch (UnknownHostException e) { throw new AssertionError(e); } - - try { - MessageDigest myMd5 = MessageDigest.getInstance("MD5"); - md5 = new SafeMessageDigest(myMd5); - } - catch (NoSuchAlgorithmException e) { - throw new AssertionError(e); - } } - public static String guid() { ByteBuffer array = guidAsBytes(); @@ -99,7 +104,8 @@ public class GuidGenerator { .append(Long.toString(rand)); String valueBeforeMD5 = sbValueBeforeMD5.toString(); - return ByteBuffer.wrap(md5.digest(valueBeforeMD5.getBytes())); + localMessageDigest.get().reset(); + return ByteBuffer.wrap(localMessageDigest.get().digest(valueBeforeMD5.getBytes())); } /*
