diff --git a/conf/storage-conf.xml b/conf/storage-conf.xml index 4c8da68d26..f78d409499 100644 --- a/conf/storage-conf.xml +++ b/conf/storage-conf.xml @@ -32,6 +32,18 @@ --> org.apache.cassandra.dht.RandomPartitioner + + + diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index 7b05160db8..4e2980c9c6 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -119,12 +119,15 @@ public class DatabaseDescriptor // the path qualified config file (storage-conf.xml) name private static String configFileName_; + /* initial token in the ring */ + private static String initialToken_ = null; static { try { configFileName_ = System.getProperty("storage-config") + System.getProperty("file.separator") + "storage-conf.xml"; + logger_.debug("Loading settings from " + configFileName_); XMLUtils xmlUtils = new XMLUtils(configFileName_); /* Cluster Name */ @@ -164,6 +167,8 @@ public class DatabaseDescriptor if ( gcGrace != null ) gcGraceInSeconds_ = Integer.parseInt(gcGrace); + initialToken_ = xmlUtils.getNodeValue("/Storage/InitialToken"); + /* Zookeeper's session timeout */ String zkSessionTimeout = xmlUtils.getNodeValue("/Storage/ZookeeperSessionTimeout"); if ( zkSessionTimeout != null ) @@ -536,6 +541,11 @@ public class DatabaseDescriptor return memtableLifetime_; } + public static String getInitialToken() + { + return initialToken_; + } + public static int getMemtableSize() { return memtableSize_; diff --git a/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java b/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java index ba07104169..ef80e7af60 100644 --- a/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java +++ b/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java @@ -24,6 +24,8 @@ import java.util.Comparator; import java.util.Locale; import java.util.Random; +import org.apache.cassandra.config.DatabaseDescriptor; + public class OrderPreservingPartitioner implements IPartitioner { // TODO make locale configurable. But don't just leave it up to the OS or you could really screw @@ -65,6 +67,11 @@ public class OrderPreservingPartitioner implements IPartitioner public StringToken getDefaultToken() { + String initialToken = DatabaseDescriptor.getInitialToken(); + if (initialToken != null) + return new StringToken(initialToken); + + // generate random token String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; Random r = new Random(); StringBuffer buffer = new StringBuffer(); diff --git a/src/java/org/apache/cassandra/dht/RandomPartitioner.java b/src/java/org/apache/cassandra/dht/RandomPartitioner.java index f43b3d8100..80d3e9ae32 100644 --- a/src/java/org/apache/cassandra/dht/RandomPartitioner.java +++ b/src/java/org/apache/cassandra/dht/RandomPartitioner.java @@ -21,6 +21,7 @@ package org.apache.cassandra.dht; import java.math.BigInteger; import java.util.Comparator; +import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.GuidGenerator; @@ -74,6 +75,11 @@ public class RandomPartitioner implements IPartitioner public BigIntegerToken getDefaultToken() { + String initialToken = DatabaseDescriptor.getInitialToken(); + if (initialToken != null) + return new BigIntegerToken(new BigInteger(initialToken)); + + // generate random token String guid = GuidGenerator.guid(); BigInteger token = FBUtilities.hash(guid); if ( token.signum() == -1 )