You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ee...@apache.org on 2011/01/28 23:56:34 UTC
svn commit: r1064921 - in /cassandra/trunk/src/java/org/apache/cassandra:
dht/RandomPartitioner.java utils/FBUtilities.java
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));