You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sl...@apache.org on 2012/09/11 17:44:08 UTC
git commit: Fix assertion in getRestrictedRange with
Murmur3Partitioner
Updated Branches:
refs/heads/trunk 55df844e0 -> 93685a478
Fix assertion in getRestrictedRange with Murmur3Partitioner
patch by slebresne; reviewed by jbellis for CASSANDRA-4621
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/93685a47
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/93685a47
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/93685a47
Branch: refs/heads/trunk
Commit: 93685a4780f2b03319f49a6cba17ef98ea22728e
Parents: 55df844
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Tue Sep 11 17:43:08 2012 +0200
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Tue Sep 11 17:43:08 2012 +0200
----------------------------------------------------------------------
CHANGES.txt | 2 +-
.../apache/cassandra/dht/Murmur3Partitioner.java | 24 +++++++++-----
2 files changed, 16 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/93685a47/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 5fcc7a4..58b3272 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -50,7 +50,7 @@
* (cql3) Add support for 2ndary indexes (CASSANDRA-3680)
* (cql3) fix defining more than one PK to be invalid (CASSANDRA-4477)
* remove schema agreement checking from all external APIs (Thrift, CQL and CQL3) (CASSANDRA-4487)
- * add Murmur3Partitioner and make it default for new installations (CASSANDRA-3772)
+ * add Murmur3Partitioner and make it default for new installations (CASSANDRA-3772, 4621)
* (cql3) update pseudo-map syntax to use map syntax (CASSANDRA-4497)
* Finer grained exceptions hierarchy and provides error code with exceptions (CASSANDRA-3979)
* Adds events push to binary protocol (CASSANDRA-4480)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/93685a47/src/java/org/apache/cassandra/dht/Murmur3Partitioner.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/dht/Murmur3Partitioner.java b/src/java/org/apache/cassandra/dht/Murmur3Partitioner.java
index 3a3972b..440b159 100644
--- a/src/java/org/apache/cassandra/dht/Murmur3Partitioner.java
+++ b/src/java/org/apache/cassandra/dht/Murmur3Partitioner.java
@@ -35,7 +35,7 @@ import org.apache.cassandra.utils.MurmurHash;
*/
public class Murmur3Partitioner extends AbstractPartitioner<LongToken>
{
- public static final LongToken MINIMUM = new LongToken(0L);
+ public static final LongToken MINIMUM = new LongToken(Long.MIN_VALUE);
public static final long MAXIMUM = Long.MAX_VALUE;
public DecoratedKey convertFromDiskFormat(ByteBuffer key)
@@ -74,18 +74,30 @@ public class Murmur3Partitioner extends AbstractPartitioner<LongToken>
return MINIMUM;
}
+ /**
+ * Generate the token of a key.
+ * Note that we need to ensure all generated token are strictly bigger than MINIMUM.
+ * In particular we don't want MINIMUM to correspond to any key because the range (MINIMUM, X] doesn't
+ * include MINIMUM but we use such range to select all data whose token is smaller than X.
+ */
public LongToken getToken(ByteBuffer key)
{
if (key.remaining() == 0)
return MINIMUM;
long hash = MurmurHash.hash3_x64_128(key, key.position(), key.remaining(), 0)[0];
- return new LongToken((hash < 0) ? -hash : hash);
+ return new LongToken(normalize(hash));
}
public LongToken getRandomToken()
{
- return new LongToken(FBUtilities.threadLocalRandom().nextLong());
+ return new LongToken(normalize(FBUtilities.threadLocalRandom().nextLong()));
+ }
+
+ private long normalize(long v)
+ {
+ // We exclude the MINIMUM value; see getToken()
+ return v == Long.MIN_VALUE ? Long.MAX_VALUE : v;
}
public boolean preservesOrder()
@@ -154,12 +166,6 @@ public class Murmur3Partitioner extends AbstractPartitioner<LongToken>
try
{
Long i = Long.valueOf(token);
-
- if (i.compareTo(MINIMUM.token) < 0)
- throw new ConfigurationException("Token must be >= 0");
-
- if (i.compareTo(MAXIMUM) > 0)
- throw new ConfigurationException("Token must be <= " + Long.MAX_VALUE);
}
catch (NumberFormatException e)
{