You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2011/07/06 18:00:19 UTC
svn commit: r1143476 - in /cassandra/branches/cassandra-0.7: ./
src/java/org/apache/cassandra/config/ src/java/org/apache/cassandra/dht/
src/java/org/apache/cassandra/gms/ src/java/org/apache/cassandra/service/
src/java/org/apache/cassandra/tools/
Author: jbellis
Date: Wed Jul 6 16:00:18 2011
New Revision: 1143476
URL: http://svn.apache.org/viewvc?rev=1143476&view=rev
Log:
ensure that string tokens do not contain commas
patch by jbellis; reviewed by slebresne for CASSANDRA-2762
Modified:
cassandra/branches/cassandra-0.7/CHANGES.txt
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/RandomPartitioner.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/Token.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/gms/Gossiper.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageService.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageServiceMBean.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/NodeProbe.java
Modified: cassandra/branches/cassandra-0.7/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/CHANGES.txt?rev=1143476&r1=1143475&r2=1143476&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.7/CHANGES.txt Wed Jul 6 16:00:18 2011
@@ -33,6 +33,7 @@
same mutation (CASSANDRA-2773)
* improve cli treatment of multiline comments (CASSANDRA-2852)
* fix describeOwnership for OPP (CASSANDRA-2800)
+ * ensure that string tokens do not contain commas (CASSANDRA-2762)
0.7.6
Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/DatabaseDescriptor.java?rev=1143476&r1=1143475&r2=1143476&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/DatabaseDescriptor.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/DatabaseDescriptor.java Wed Jul 6 16:00:18 2011
@@ -40,6 +40,8 @@ import org.apache.cassandra.db.Table;
import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.db.migration.Migration;
import org.apache.cassandra.dht.IPartitioner;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.gms.VersionedValue;
import org.apache.cassandra.io.sstable.Descriptor;
import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.locator.*;
@@ -360,6 +362,9 @@ public class DatabaseDescriptor
throw new ConfigurationException("saved_caches_directory missing");
}
+ if (conf.initial_token != null)
+ partitioner.getTokenFactory().validate(conf.initial_token);
+
// Hardcoded system tables
KSMetaData systemMeta = new KSMetaData(Table.SYSTEM_TABLE,
LocalStrategy.class,
Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java?rev=1143476&r1=1143475&r2=1143476&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java Wed Jul 6 16:00:18 2011
@@ -27,6 +27,7 @@ import java.util.List;
import java.util.Map;
import java.util.Random;
+import org.apache.cassandra.config.ConfigurationException;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.commons.lang.ArrayUtils;
@@ -151,6 +152,18 @@ public abstract class AbstractByteOrdere
return FBUtilities.bytesToHex(bytesToken.token);
}
+ public void validate(String token) throws ConfigurationException
+ {
+ try
+ {
+ FBUtilities.hexToBytes(token);
+ }
+ catch (NumberFormatException e)
+ {
+ throw new ConfigurationException("Token " + token + " contains non-hex digits");
+ }
+ }
+
public Token<byte[]> fromString(String string)
{
return new BytesToken(FBUtilities.hexToBytes(string));
Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java?rev=1143476&r1=1143475&r2=1143476&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java Wed Jul 6 16:00:18 2011
@@ -24,8 +24,10 @@ import java.nio.charset.CharacterCodingE
import java.util.*;
import org.apache.cassandra.config.CFMetaData;
+import org.apache.cassandra.config.ConfigurationException;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.gms.VersionedValue;
import org.apache.cassandra.service.StorageService;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.FBUtilities;
@@ -136,6 +138,12 @@ public class OrderPreservingPartitioner
return stringToken.token;
}
+ public void validate(String token) throws ConfigurationException
+ {
+ if (token.contains(VersionedValue.DELIMITER_STR))
+ throw new ConfigurationException("Tokens may not contain the character " + VersionedValue.DELIMITER_STR);
+ }
+
public Token<String> fromString(String string)
{
return new StringToken(string);
Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/RandomPartitioner.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/RandomPartitioner.java?rev=1143476&r1=1143475&r2=1143476&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/RandomPartitioner.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/RandomPartitioner.java Wed Jul 6 16:00:18 2011
@@ -24,6 +24,7 @@ import java.nio.ByteBuffer;
import java.nio.charset.CharacterCodingException;
import java.util.*;
+import org.apache.cassandra.config.ConfigurationException;
import org.apache.cassandra.db.DecoratedKey;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.FBUtilities;
@@ -113,6 +114,18 @@ public class RandomPartitioner implement
return bigIntegerToken.token.toString();
}
+ public void validate(String token) throws ConfigurationException
+ {
+ try
+ {
+ new BigInteger(token);
+ }
+ catch (NumberFormatException e)
+ {
+ throw new ConfigurationException(e.getMessage());
+ }
+ }
+
public Token<BigInteger> fromString(String string)
{
return new BigIntegerToken(new BigInteger(string));
Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/Token.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/Token.java?rev=1143476&r1=1143475&r2=1143476&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/Token.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/Token.java Wed Jul 6 16:00:18 2011
@@ -24,6 +24,7 @@ import java.io.IOException;
import java.io.Serializable;
import java.nio.ByteBuffer;
+import org.apache.cassandra.config.ConfigurationException;
import org.apache.cassandra.io.ICompactSerializer2;
import org.apache.cassandra.service.StorageService;
import org.apache.cassandra.utils.ByteBufferUtil;
@@ -74,6 +75,8 @@ public abstract class Token<T> implement
public abstract Token<T> fromByteArray(ByteBuffer bytes);
public abstract String toString(Token<T> token); // serialize as string, not necessarily human-readable
public abstract Token<T> fromString(String string); // deserialize
+
+ public abstract void validate(String token) throws ConfigurationException;
}
public static class TokenSerializer implements ICompactSerializer2<Token>
Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/gms/Gossiper.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/gms/Gossiper.java?rev=1143476&r1=1143475&r2=1143476&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/gms/Gossiper.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/gms/Gossiper.java Wed Jul 6 16:00:18 2011
@@ -27,6 +27,7 @@ import java.util.Map.Entry;
import java.util.concurrent.*;
import org.apache.cassandra.concurrent.RetryingScheduledThreadPoolExecutor;
+import org.apache.cassandra.config.ConfigurationException;
import org.apache.cassandra.utils.FBUtilities;
import org.cliffc.high_scale_lib.NonBlockingHashMap;
import org.slf4j.Logger;
Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageService.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageService.java?rev=1143476&r1=1143475&r2=1143476&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageService.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageService.java Wed Jul 6 16:00:18 2011
@@ -33,6 +33,7 @@ import com.google.common.collect.HashMul
import com.google.common.collect.Multimap;
import org.apache.cassandra.db.commitlog.CommitLog;
+import org.apache.cassandra.dht.*;
import org.apache.cassandra.locator.*;
import org.apache.log4j.Level;
import org.apache.commons.lang.StringUtils;
@@ -44,10 +45,6 @@ import org.apache.cassandra.config.*;
import org.apache.cassandra.db.*;
import org.apache.cassandra.db.migration.AddKeyspace;
import org.apache.cassandra.db.migration.Migration;
-import org.apache.cassandra.dht.BootStrapper;
-import org.apache.cassandra.dht.IPartitioner;
-import org.apache.cassandra.dht.Range;
-import org.apache.cassandra.dht.Token;
import org.apache.cassandra.gms.*;
import org.apache.cassandra.io.DeletionService;
import org.apache.cassandra.io.util.FileUtils;
@@ -1583,10 +1580,17 @@ public class StorageService implements I
}
FBUtilities.sortSampledKeys(keys, range);
- if (keys.size() < 3)
- return partitioner.midpoint(range.left, range.right);
- else
- return keys.get(keys.size() / 2).token;
+ Token token = keys.size() < 3
+ ? partitioner.midpoint(range.left, range.right)
+ : keys.get(keys.size() / 2).token;
+ // Hack to prevent giving nodes tokens with DELIMITER_STR in them (which is fine in a row key/token)
+ if (token instanceof StringToken)
+ {
+ token = new StringToken(((String)token.token).replaceAll(VersionedValue.DELIMITER_STR, ""));
+ if (tokenMetadata_.getTokenToEndpointMap().containsKey(token))
+ throw new RuntimeException("Unable to compute unique token for new node -- specify one manually with initial_token");
+ }
+ return token;
}
/**
@@ -1707,8 +1711,9 @@ public class StorageService implements I
onFinish.run();
}
- public void move(String newToken) throws IOException, InterruptedException
+ public void move(String newToken) throws IOException, InterruptedException, ConfigurationException
{
+ partitioner.getTokenFactory().validate(newToken);
move(partitioner.getTokenFactory().fromString(newToken));
}
Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageServiceMBean.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageServiceMBean.java?rev=1143476&r1=1143475&r2=1143476&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageServiceMBean.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageServiceMBean.java Wed Jul 6 16:00:18 2011
@@ -192,7 +192,7 @@ public interface StorageServiceMBean
* @param newToken token to move this node to.
* This node will unload its data onto its neighbors, and bootstrap to the new token.
*/
- public void move(String newToken) throws IOException, InterruptedException;
+ public void move(String newToken) throws IOException, InterruptedException, ConfigurationException;
/**
* This node will unload its data onto its neighbors, and bootstrap to share the range
Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/NodeProbe.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/NodeProbe.java?rev=1143476&r1=1143475&r2=1143476&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/NodeProbe.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/NodeProbe.java Wed Jul 6 16:00:18 2011
@@ -352,7 +352,7 @@ public class NodeProbe
ssProxy.loadBalance();
}
- public void move(String newToken) throws IOException, InterruptedException
+ public void move(String newToken) throws IOException, InterruptedException, ConfigurationException
{
ssProxy.move(newToken);
}