allow specifying initial token. patch by Jun Rao; reviewed by jbellis for CASSANDRA-181

git-svn-id: https://svn.apache.org/repos/asf/incubator/cassandra/trunk@775203 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jonathan Ellis 2009-05-15 15:55:35 +00:00
parent 1fdfad82b3
commit 324c3c32a1
4 changed files with 35 additions and 0 deletions

View File

@ -32,6 +32,18 @@
-->
<Partitioner>org.apache.cassandra.dht.RandomPartitioner</Partitioner>
<!-- If you are using the OrderPreservingPartitioner and you know your key
distribution, you can specify the token for this node to use.
(Keys are sent to the node with the "closest" token, so distributing
your tokens equally along the key distribution space will spread
keys evenly across your cluster.) This setting is only checked the
first time a node is started.
This can also be useful with RandomPartitioner to force equal
spacing of tokens around the hash space, especially for
clusters with a small number of nodes. -->
<InitialToken></InitialToken>
<!-- RackAware: Setting this to true instructs Cassandra to try and place the replicas in
a different rack in the same datacenter and one in a different datacenter
-->

View File

@ -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_;

View File

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

View File

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