Author: jbellis
Date: Wed Aug 31 19:26:21 2011
New Revision: 1163753
URL: http://svn.apache.org/viewvc?rev=1163753&view=rev
Log:
merge from 0.8
Modified:
cassandra/trunk/ (props changed)
cassandra/trunk/CHANGES.txt
cassandra/trunk/contrib/ (props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
(props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
(props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
(props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
(props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
(props changed)
cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java
cassandra/trunk/src/java/org/apache/cassandra/dht/Bounds.java
cassandra/trunk/src/java/org/apache/cassandra/dht/Range.java
cassandra/trunk/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java
cassandra/trunk/src/java/org/apache/cassandra/service/ClientState.java
cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java
cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
Propchange: cassandra/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 31 19:26:21 2011
@@ -1,7 +1,7 @@
/cassandra/branches/cassandra-0.6:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7:1026516-1163266
+/cassandra/branches/cassandra-0.7:1026516-1163280
/cassandra/branches/cassandra-0.7.0:1053690-1055654
-/cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1163272,1163677,1163695
+/cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1163752
/cassandra/branches/cassandra-0.8.0:1125021-1130369
/cassandra/branches/cassandra-0.8.1:1101014-1125018
/cassandra/tags/cassandra-0.7.0-rc3:1051699-1053689
Modified: cassandra/trunk/CHANGES.txt
URL:
http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1163753&r1=1163752&r2=1163753&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Wed Aug 31 19:26:21 2011
@@ -99,6 +99,10 @@
* make repair report failure when a node participating dies (instead of
hanging forever) (CASSANDRA-2433)
* fix handling of the empty byte buffer by ReversedType (CASSANDRA-3111)
+ * Add validation that Keyspace names are case-insensitively unique
(CASSANDRA-3066)
+ * catch invalid key_validation_class before instantiating UpdateColumnFamily
(CASSANDRA-3102)
+ * make Range and Bounds objects client-safe (CASSANDRA-3108)
+ * optionally skip log4j configuration (CASSANDRA-3061)
0.8.4
* include files-to-be-streamed in StreamInSession.getSources (CASSANDRA-2972)
Propchange: cassandra/trunk/contrib/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 31 19:26:21 2011
@@ -1,7 +1,7 @@
/cassandra/branches/cassandra-0.6/contrib:922689-1052356,1052358-1053452,1053454,1053456-1068009
-/cassandra/branches/cassandra-0.7/contrib:1026516-1163266
+/cassandra/branches/cassandra-0.7/contrib:1026516-1163280
/cassandra/branches/cassandra-0.7.0/contrib:1053690-1055654
-/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1163272,1163677,1163695
+/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1163752
/cassandra/branches/cassandra-0.8.0/contrib:1125021-1130369
/cassandra/branches/cassandra-0.8.1/contrib:1101014-1125018
/cassandra/tags/cassandra-0.7.0-rc3/contrib:1051699-1053689
Propchange:
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 31 19:26:21 2011
@@ -1,7 +1,7 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1163266
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1163280
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125019-1163272,1163677,1163695
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125019-1163752
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1125021-1130369
/cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1101014-1125018
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1051699-1053689
Propchange:
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 31 19:26:21 2011
@@ -1,7 +1,7 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1163266
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1163280
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125019-1163272,1163677,1163695
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125019-1163752
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1125021-1130369
/cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1101014-1125018
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1051699-1053689
Propchange:
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 31 19:26:21 2011
@@ -1,7 +1,7 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1163266
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1163280
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125019-1163272,1163677,1163695
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125019-1163752
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1125021-1130369
/cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1101014-1125018
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1051699-1053689
Propchange:
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 31 19:26:21 2011
@@ -1,7 +1,7 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1163266
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1163280
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125019-1163272,1163677,1163695
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125019-1163752
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1125021-1130369
/cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1101014-1125018
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1051699-1053689
Propchange:
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 31 19:26:21 2011
@@ -1,7 +1,7 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1163266
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1163280
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125019-1163272,1163677,1163695
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125019-1163752
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1125021-1130369
/cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1101014-1125018
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1051699-1053689
Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java?rev=1163753&r1=1163752&r2=1163753&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java Wed
Aug 31 19:26:21 2011
@@ -664,7 +664,7 @@ public class QueryProcessor
case CREATE_KEYSPACE:
CreateKeyspaceStatement create =
(CreateKeyspaceStatement)statement.statement;
create.validate();
- clientState.hasKeyspaceListAccess(Permission.WRITE);
+ clientState.hasKeyspaceSchemaAccess(Permission.WRITE);
validateSchemaAgreement();
try
@@ -674,6 +674,7 @@ public class QueryProcessor
Collections.<CfDef>emptyList())
.setStrategy_options(create.getStrategyOptions());
ThriftValidation.validateKsDef(ksd);
+
ThriftValidation.validateKeyspaceNotYetExisting(create.getName());
applyMigrationOnStage(new
AddKeyspace(KSMetaData.fromThrift(ksd)));
}
catch (ConfigurationException e)
@@ -694,7 +695,7 @@ public class QueryProcessor
case CREATE_COLUMNFAMILY:
CreateColumnFamilyStatement createCf =
(CreateColumnFamilyStatement)statement.statement;
- clientState.hasColumnFamilyListAccess(Permission.WRITE);
+ clientState.hasColumnFamilySchemaAccess(Permission.WRITE);
validateSchemaAgreement();
try
@@ -719,7 +720,7 @@ public class QueryProcessor
case CREATE_INDEX:
CreateIndexStatement createIdx =
(CreateIndexStatement)statement.statement;
- clientState.hasColumnFamilyListAccess(Permission.WRITE);
+ clientState.hasColumnFamilySchemaAccess(Permission.WRITE);
validateSchemaAgreement();
CFMetaData oldCfm = Schema.instance.getCFMetaData(keyspace,
createIdx.getColumnFamily());
if (oldCfm == null)
@@ -779,7 +780,7 @@ public class QueryProcessor
case DROP_INDEX:
DropIndexStatement dropIdx =
(DropIndexStatement)statement.statement;
- clientState.hasColumnFamilyListAccess(Permission.WRITE);
+ clientState.hasColumnFamilySchemaAccess(Permission.WRITE);
validateSchemaAgreement();
try
@@ -804,7 +805,7 @@ public class QueryProcessor
case DROP_KEYSPACE:
String deleteKeyspace = (String)statement.statement;
- clientState.hasKeyspaceListAccess(Permission.WRITE);
+ clientState.hasKeyspaceSchemaAccess(Permission.WRITE);
validateSchemaAgreement();
try
@@ -829,7 +830,7 @@ public class QueryProcessor
case DROP_COLUMNFAMILY:
String deleteColumnFamily = (String)statement.statement;
- clientState.hasColumnFamilyListAccess(Permission.WRITE);
+ clientState.hasColumnFamilySchemaAccess(Permission.WRITE);
validateSchemaAgreement();
try
Modified: cassandra/trunk/src/java/org/apache/cassandra/dht/Bounds.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/dht/Bounds.java?rev=1163753&r1=1163752&r2=1163753&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/dht/Bounds.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/dht/Bounds.java Wed Aug 31
19:26:21 2011
@@ -47,7 +47,7 @@ public class Bounds extends AbstractBoun
public AbstractBounds createFrom(Token token)
{
- return new Bounds(left, token);
+ return new Bounds(left, token, partitioner);
}
public List<AbstractBounds> unwrap()
Modified: cassandra/trunk/src/java/org/apache/cassandra/dht/Range.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/dht/Range.java?rev=1163753&r1=1163752&r2=1163753&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/dht/Range.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/dht/Range.java Wed Aug 31
19:26:21 2011
@@ -146,7 +146,8 @@ public class Range extends AbstractBound
if (!(left.compareTo(that.right) < 0 && that.left.compareTo(right)
< 0))
return Collections.emptySet();
return rangeSet(new Range((Token)ObjectUtils.max(this.left,
that.left),
- (Token)ObjectUtils.min(this.right,
that.right)));
+ (Token)ObjectUtils.min(this.right,
that.right),
+ partitioner));
}
if (thiswraps && thatwraps)
{
@@ -174,8 +175,8 @@ public class Range extends AbstractBound
{
Set<Range> intersection = new HashSet<Range>(2);
if (that.right.compareTo(first.left) > 0)
- intersection.add(new Range(first.left, that.right));
- intersection.add(new Range(that.left, first.right));
+ intersection.add(new Range(first.left, that.right,
first.partitioner));
+ intersection.add(new Range(that.left, first.right, first.partitioner));
return Collections.unmodifiableSet(intersection);
}
@@ -183,10 +184,10 @@ public class Range extends AbstractBound
{
Set<Range> intersection = new HashSet<Range>(2);
if (other.contains(wrapping.right))
- intersection.add(new Range(other.left, wrapping.right));
+ intersection.add(new Range(other.left, wrapping.right,
wrapping.partitioner));
// need the extra compareto here because ranges are asymmetrical;
wrapping.left _is not_ contained by the wrapping range
if (other.contains(wrapping.left) &&
wrapping.left.compareTo(other.right) < 0)
- intersection.add(new Range(wrapping.left, other.right));
+ intersection.add(new Range(wrapping.left, other.right,
wrapping.partitioner));
return Collections.unmodifiableSet(intersection);
}
@@ -194,7 +195,7 @@ public class Range extends AbstractBound
{
if (token.equals(left))
return null;
- return new Range(left, token);
+ return new Range(left, token, partitioner);
}
public List<AbstractBounds> unwrap()
@@ -202,8 +203,8 @@ public class Range extends AbstractBound
if (!isWrapAround() || right.equals(partitioner.getMinimumToken()))
return (List)Arrays.asList(this);
List<AbstractBounds> unwrapped = new ArrayList<AbstractBounds>(2);
- unwrapped.add(new Range(left, partitioner.getMinimumToken()));
- unwrapped.add(new Range(partitioner.getMinimumToken(), right));
+ unwrapped.add(new Range(left, partitioner.getMinimumToken(),
partitioner));
+ unwrapped.add(new Range(partitioner.getMinimumToken(), right,
partitioner));
return unwrapped;
}
@@ -272,9 +273,9 @@ public class Range extends AbstractBound
ArrayList<Range> difference = new ArrayList<Range>();
if (!left.equals(contained.left))
- difference.add(new Range(left, contained.left));
+ difference.add(new Range(left, contained.left, partitioner));
if (!right.equals(contained.right))
- difference.add(new Range(contained.right, right));
+ difference.add(new Range(contained.right, right, partitioner));
return difference;
}
Modified:
cassandra/trunk/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java?rev=1163753&r1=1163752&r2=1163753&view=diff
==============================================================================
---
cassandra/trunk/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java
(original)
+++
cassandra/trunk/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java
Wed Aug 31 19:26:21 2011
@@ -61,40 +61,43 @@ public abstract class AbstractCassandraD
*/
public static void initLog4j()
{
- String config = System.getProperty("log4j.configuration",
"log4j-server.properties");
- URL configLocation = null;
- try
- {
- // try loading from a physical location first.
- configLocation = new URL(config);
- }
- catch (MalformedURLException ex)
+ if
(System.getProperty("log4j.defaultInitOverride","false").equalsIgnoreCase("true"))
{
- // then try loading from the classpath.
- configLocation =
AbstractCassandraDaemon.class.getClassLoader().getResource(config);
- }
+ String config = System.getProperty("log4j.configuration",
"log4j-server.properties");
+ URL configLocation = null;
+ try
+ {
+ // try loading from a physical location first.
+ configLocation = new URL(config);
+ }
+ catch (MalformedURLException ex)
+ {
+ // then try loading from the classpath.
+ configLocation =
AbstractCassandraDaemon.class.getClassLoader().getResource(config);
+ }
- if (configLocation == null)
- throw new RuntimeException("Couldn't figure out log4j
configuration: "+config);
+ if (configLocation == null)
+ throw new RuntimeException("Couldn't figure out log4j
configuration: "+config);
- // Now convert URL to a filename
- String configFileName = null;
- try
- {
- // first try URL.getFile() which works for opaque URLs (file:foo)
and paths without spaces
- configFileName = configLocation.getFile();
- File configFile = new File(configFileName);
- // then try alternative approach which works for all hierarchical
URLs with or without spaces
- if (!configFile.exists())
- configFileName = new
File(configLocation.toURI()).getCanonicalPath();
- }
- catch (Exception e)
- {
- throw new RuntimeException("Couldn't convert log4j configuration
location to a valid file", e);
- }
+ // Now convert URL to a filename
+ String configFileName = null;
+ try
+ {
+ // first try URL.getFile() which works for opaque URLs
(file:foo) and paths without spaces
+ configFileName = configLocation.getFile();
+ File configFile = new File(configFileName);
+ // then try alternative approach which works for all
hierarchical URLs with or without spaces
+ if (!configFile.exists())
+ configFileName = new
File(configLocation.toURI()).getCanonicalPath();
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException("Couldn't convert log4j
configuration location to a valid file", e);
+ }
- PropertyConfigurator.configureAndWatch(configFileName, 10000);
-
org.apache.log4j.Logger.getLogger(AbstractCassandraDaemon.class).info("Logging
initialized");
+ PropertyConfigurator.configureAndWatch(configFileName, 10000);
+
org.apache.log4j.Logger.getLogger(AbstractCassandraDaemon.class).info("Logging
initialized");
+ }
}
private static Logger logger =
LoggerFactory.getLogger(AbstractCassandraDaemon.class);
Modified: cassandra/trunk/src/java/org/apache/cassandra/service/ClientState.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/ClientState.java?rev=1163753&r1=1163752&r2=1163753&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/ClientState.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/ClientState.java Wed
Aug 31 19:26:21 2011
@@ -30,6 +30,7 @@ import org.apache.cassandra.auth.Authent
import org.apache.cassandra.auth.Permission;
import org.apache.cassandra.auth.Resources;
import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.Table;
import org.apache.cassandra.thrift.AuthenticationException;
import org.apache.cassandra.thrift.InvalidRequestException;
@@ -111,7 +112,7 @@ public class ClientState
/**
* Confirms that the client thread has the given Permission for the
Keyspace list.
*/
- public void hasKeyspaceListAccess(Permission perm) throws
InvalidRequestException
+ public void hasKeyspaceSchemaAccess(Permission perm) throws
InvalidRequestException
{
validateLogin();
@@ -125,13 +126,13 @@ public class ClientState
* Confirms that the client thread has the given Permission for the
ColumnFamily list of
* the current keyspace.
*/
- public void hasColumnFamilyListAccess(Permission perm) throws
InvalidRequestException
+ public void hasColumnFamilySchemaAccess(Permission perm) throws
InvalidRequestException
{
validateLogin();
validateKeyspace();
// hardcode disallowing messing with system keyspace
- if (keyspace.equalsIgnoreCase("system"))
+ if (keyspace.equalsIgnoreCase(Table.SYSTEM_TABLE) && perm ==
Permission.WRITE)
throw new InvalidRequestException("system keyspace is not
user-modifiable");
resourceClear();
Modified:
cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java?rev=1163753&r1=1163752&r2=1163753&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java
Wed Aug 31 19:26:21 2011
@@ -647,7 +647,7 @@ public class CassandraServer implements
public KsDef describe_keyspace(String table) throws NotFoundException,
InvalidRequestException
{
- state().hasKeyspaceListAccess(Permission.READ);
+ state().hasKeyspaceSchemaAccess(Permission.READ);
KSMetaData ksm = Schema.instance.getTableDefinition(table);
if (ksm == null)
@@ -752,7 +752,7 @@ public class CassandraServer implements
public List<KsDef> describe_keyspaces() throws TException,
InvalidRequestException
{
- state().hasKeyspaceListAccess(Permission.READ);
+ state().hasKeyspaceSchemaAccess(Permission.READ);
Set<String> keyspaces = Schema.instance.getTables();
List<KsDef> ksset = new ArrayList<KsDef>();
@@ -873,7 +873,7 @@ public class CassandraServer implements
throws InvalidRequestException, SchemaDisagreementException, TException
{
logger.debug("add_column_family");
- state().hasColumnFamilyListAccess(Permission.WRITE);
+ state().hasColumnFamilySchemaAccess(Permission.WRITE);
CFMetaData.addDefaultIndexNames(cf_def);
ThriftValidation.validateCfDef(cf_def, null);
validateSchemaAgreement();
@@ -901,7 +901,7 @@ public class CassandraServer implements
throws InvalidRequestException, SchemaDisagreementException, TException
{
logger.debug("drop_column_family");
- state().hasColumnFamilyListAccess(Permission.WRITE);
+ state().hasColumnFamilySchemaAccess(Permission.WRITE);
validateSchemaAgreement();
try
@@ -927,9 +927,10 @@ public class CassandraServer implements
throws InvalidRequestException, SchemaDisagreementException, TException
{
logger.debug("add_keyspace");
- state().hasKeyspaceListAccess(Permission.WRITE);
+ state().hasKeyspaceSchemaAccess(Permission.WRITE);
validateSchemaAgreement();
-
+ ThriftValidation.validateKeyspaceNotYetExisting(ks_def.name);
+
// generate a meaningful error if the user setup keyspace and/or
column definition incorrectly
for (CfDef cf : ks_def.cf_defs)
{
@@ -971,7 +972,7 @@ public class CassandraServer implements
throws InvalidRequestException, SchemaDisagreementException, TException
{
logger.debug("drop_keyspace");
- state().hasKeyspaceListAccess(Permission.WRITE);
+ state().hasKeyspaceSchemaAccess(Permission.WRITE);
validateSchemaAgreement();
try
@@ -999,7 +1000,7 @@ public class CassandraServer implements
throws InvalidRequestException, SchemaDisagreementException, TException
{
logger.debug("update_keyspace");
- state().hasKeyspaceListAccess(Permission.WRITE);
+ state().hasKeyspaceSchemaAccess(Permission.WRITE);
ThriftValidation.validateTable(ks_def.name);
if (ks_def.getCf_defs() != null && ks_def.getCf_defs().size() > 0)
throw new InvalidRequestException("Keyspace update must not
contain any column family definitions.");
@@ -1029,7 +1030,7 @@ public class CassandraServer implements
throws InvalidRequestException, SchemaDisagreementException, TException
{
logger.debug("update_column_family");
- state().hasColumnFamilyListAccess(Permission.WRITE);
+ state().hasColumnFamilySchemaAccess(Permission.WRITE);
if (cf_def.keyspace == null || cf_def.name == null)
throw new InvalidRequestException("Keyspace and CF name must be
set.");
CFMetaData oldCfm = Schema.instance.getCFMetaData(cf_def.keyspace,
cf_def.name);
Modified:
cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java?rev=1163753&r1=1163752&r2=1163753&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
Wed Aug 31 19:26:21 2011
@@ -562,6 +562,7 @@ public class ThriftValidation
if (cfType == null)
throw new InvalidRequestException("invalid column type " +
cf_def.column_type);
+ TypeParser.parse(cf_def.key_validation_class);
TypeParser.parse(cf_def.comparator_type);
TypeParser.parse(cf_def.subcomparator_type);
TypeParser.parse(cf_def.default_validation_class);
@@ -718,4 +719,16 @@ public class ThriftValidation
if (cf_def.isSetMemtable_operations_in_millions())
DatabaseDescriptor.validateMemtableOperations(cf_def.memtable_operations_in_millions);
}
+
+ public static void validateKeyspaceNotYetExisting(String newKsName) throws
InvalidRequestException
+ {
+ // keyspace names must be unique case-insensitively because the
keyspace name becomes the directory
+ // where we store CF sstables. Names that differ only in case would
thus cause problems on
+ // case-insensitive filesystems (NTFS, most installations of HFS+).
+ for (String ksName : DatabaseDescriptor.getTables())
+ {
+ if (ksName.equalsIgnoreCase(newKsName))
+ throw new InvalidRequestException("Keyspace names must be
case-insensitively unique");
+ }
+ }
}