Author: eevans Date: Fri Jan 28 22:56:34 2011 New Revision: 1064921 URL: http://svn.apache.org/viewvc?rev=1064921&view=rev Log: Avoid thread contention in FBUtilities.hash
Patch by brandonwilliams and jbellis, reviewed by brandonwilliams for CASSANDRA-1369 Modified: cassandra/trunk/src/java/org/apache/cassandra/dht/RandomPartitioner.java cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java Modified: cassandra/trunk/src/java/org/apache/cassandra/dht/RandomPartitioner.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/dht/RandomPartitioner.java?rev=1064921&r1=1064920&r2=1064921&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/dht/RandomPartitioner.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/dht/RandomPartitioner.java Fri Jan 28 22:56:34 2011 @@ -84,7 +84,7 @@ public class RandomPartitioner implement public BigIntegerToken getRandomToken() { - BigInteger token = FBUtilities.md5hash(GuidGenerator.guidAsBytes()); + BigInteger token = FBUtilities.hashToBigInteger(GuidGenerator.guidAsBytes()); if ( token.signum() == -1 ) token = token.multiply(BigInteger.valueOf(-1L)); return new BigIntegerToken(token); @@ -126,7 +126,7 @@ public class RandomPartitioner implement { if (key.remaining() == 0) return MINIMUM; - return new BigIntegerToken(FBUtilities.md5hash(key)); + return new BigIntegerToken(FBUtilities.hashToBigInteger(key)); } public Map<Token, Float> describeOwnership(List<Token> sortedTokens) Modified: cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java?rev=1064921&r1=1064920&r2=1064921&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java Fri Jan 28 22:56:34 2011 @@ -28,6 +28,7 @@ import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.nio.charset.CharacterCodingException; import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -62,6 +63,22 @@ public class FBUtilities private static volatile InetAddress localInetAddress_; + 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); + } + } + }; + public static final int MAX_UNSIGNED_SHORT = 0xFFFF; /** @@ -245,19 +262,20 @@ public class FBUtilities return out; } - public static BigInteger md5hash(ByteBuffer data) + public static BigInteger hashToBigInteger(ByteBuffer data) { - byte[] result = hash("MD5", data); + byte[] result = hash(data); BigInteger hash = new BigInteger(result); return hash.abs(); } - public static byte[] hash(String type, ByteBuffer... data) + public static byte[] hash(ByteBuffer... data) { byte[] result; try { - MessageDigest messageDigest = MessageDigest.getInstance(type); + MessageDigest messageDigest = localMessageDigest.get(); + messageDigest.reset(); for(ByteBuffer block : data) { messageDigest.update(ByteBufferUtil.clone(block));