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));