Author: gdusbabek
Date: Fri May 28 19:00:12 2010
New Revision: 949261
URL: http://svn.apache.org/viewvc?rev=949261&view=rev
Log:
reject describe_ring requests on invalid keyspaces. patch by gdusbabek,
reviewed by jbellis. CASSANDRA-1111
Modified:
cassandra/branches/cassandra-0.6/CHANGES.txt
cassandra/branches/cassandra-0.6/interface/cassandra.thrift
cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/hadoop/ColumnFamilyInputFormat.java
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/thrift/CassandraServer.java
cassandra/branches/cassandra-0.6/test/system/test_server.py
Modified: cassandra/branches/cassandra-0.6/CHANGES.txt
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/CHANGES.txt?rev=949261&r1=949260&r2=949261&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.6/CHANGES.txt Fri May 28 19:00:12 2010
@@ -1,6 +1,7 @@
0.6.3
* retry to make streaming connections up to 8 times. (CASSANDRA-1019)
* fix potential for duplicate rows seen by Hadoop jobs (CASSANDRA-1042)
+ * reject describe_ring() calls on invalid keyspaces (CASSANDRA-1111)
0.6.2
* fix contrib/word_count build. (CASSANDRA-992)
Modified: cassandra/branches/cassandra-0.6/interface/cassandra.thrift
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/interface/cassandra.thrift?rev=949261&r1=949260&r2=949261&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/interface/cassandra.thrift (original)
+++ cassandra/branches/cassandra-0.6/interface/cassandra.thrift Fri May 28
19:00:12 2010
@@ -443,7 +443,8 @@ service Cassandra {
for the same reason, we can't return a set here, even though
order is neither important nor predictable. */
- list<TokenRange> describe_ring(1:required string keyspace),
+ list<TokenRange> describe_ring(1:required string keyspace)
+ throws (1:InvalidRequestException ire),
/** describe specified keyspace */
map<string, map<string, string>> describe_keyspace(1:required string
keyspace)
Modified:
cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java?rev=949261&r1=949260&r2=949261&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
(original)
+++
cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
Fri May 28 19:00:12 2010
@@ -225,7 +225,7 @@ public class Cassandra {
*
* @param keyspace
*/
- public List<TokenRange> describe_ring(String keyspace) throws TException;
+ public List<TokenRange> describe_ring(String keyspace) throws
InvalidRequestException, TException;
/**
* describe specified keyspace
@@ -969,7 +969,7 @@ public class Cassandra {
throw new TApplicationException(TApplicationException.MISSING_RESULT,
"describe_version failed: unknown result");
}
- public List<TokenRange> describe_ring(String keyspace) throws TException
+ public List<TokenRange> describe_ring(String keyspace) throws
InvalidRequestException, TException
{
send_describe_ring(keyspace);
return recv_describe_ring();
@@ -985,7 +985,7 @@ public class Cassandra {
oprot_.getTransport().flush();
}
- public List<TokenRange> recv_describe_ring() throws TException
+ public List<TokenRange> recv_describe_ring() throws
InvalidRequestException, TException
{
TMessage msg = iprot_.readMessageBegin();
if (msg.type == TMessageType.EXCEPTION) {
@@ -999,6 +999,9 @@ public class Cassandra {
if (result.isSetSuccess()) {
return result.success;
}
+ if (result.ire != null) {
+ throw result.ire;
+ }
throw new TApplicationException(TApplicationException.MISSING_RESULT,
"describe_ring failed: unknown result");
}
@@ -1778,7 +1781,19 @@ public class Cassandra {
}
iprot.readMessageEnd();
describe_ring_result result = new describe_ring_result();
- result.success = iface_.describe_ring(args.keyspace);
+ try {
+ result.success = iface_.describe_ring(args.keyspace);
+ } catch (InvalidRequestException ire) {
+ result.ire = ire;
+ } catch (Throwable th) {
+ LOGGER.error("Internal error processing describe_ring", th);
+ TApplicationException x = new
TApplicationException(TApplicationException.INTERNAL_ERROR, "Internal error
processing describe_ring");
+ oprot.writeMessageBegin(new TMessage("describe_ring",
TMessageType.EXCEPTION, seqid));
+ x.write(oprot);
+ oprot.writeMessageEnd();
+ oprot.getTransport().flush();
+ return;
+ }
oprot.writeMessageBegin(new TMessage("describe_ring",
TMessageType.REPLY, seqid));
result.write(oprot);
oprot.writeMessageEnd();
@@ -18313,12 +18328,15 @@ public class Cassandra {
private static final TStruct STRUCT_DESC = new
TStruct("describe_ring_result");
private static final TField SUCCESS_FIELD_DESC = new TField("success",
TType.LIST, (short)0);
+ private static final TField IRE_FIELD_DESC = new TField("ire",
TType.STRUCT, (short)1);
public List<TokenRange> success;
+ public InvalidRequestException ire;
/** The set of fields this struct contains, along with convenience methods
for finding and manipulating them. */
public enum _Fields implements TFieldIdEnum {
- SUCCESS((short)0, "success");
+ SUCCESS((short)0, "success"),
+ IRE((short)1, "ire");
private static final Map<Integer, _Fields> byId = new HashMap<Integer,
_Fields>();
private static final Map<String, _Fields> byName = new HashMap<String,
_Fields>();
@@ -18377,6 +18395,8 @@ public class Cassandra {
put(_Fields.SUCCESS, new FieldMetaData("success",
TFieldRequirementType.DEFAULT,
new ListMetaData(TType.LIST,
new StructMetaData(TType.STRUCT, TokenRange.class))));
+ put(_Fields.IRE, new FieldMetaData("ire", TFieldRequirementType.DEFAULT,
+ new FieldValueMetaData(TType.STRUCT)));
}});
static {
@@ -18387,10 +18407,12 @@ public class Cassandra {
}
public describe_ring_result(
- List<TokenRange> success)
+ List<TokenRange> success,
+ InvalidRequestException ire)
{
this();
this.success = success;
+ this.ire = ire;
}
/**
@@ -18404,6 +18426,9 @@ public class Cassandra {
}
this.success = __this__success;
}
+ if (other.isSetIre()) {
+ this.ire = new InvalidRequestException(other.ire);
+ }
}
public describe_ring_result deepCopy() {
@@ -18454,6 +18479,30 @@ public class Cassandra {
}
}
+ public InvalidRequestException getIre() {
+ return this.ire;
+ }
+
+ public describe_ring_result setIre(InvalidRequestException ire) {
+ this.ire = ire;
+ return this;
+ }
+
+ public void unsetIre() {
+ this.ire = null;
+ }
+
+ /** Returns true if field ire is set (has been asigned a value) and false
otherwise */
+ public boolean isSetIre() {
+ return this.ire != null;
+ }
+
+ public void setIreIsSet(boolean value) {
+ if (!value) {
+ this.ire = null;
+ }
+ }
+
public void setFieldValue(_Fields field, Object value) {
switch (field) {
case SUCCESS:
@@ -18464,6 +18513,14 @@ public class Cassandra {
}
break;
+ case IRE:
+ if (value == null) {
+ unsetIre();
+ } else {
+ setIre((InvalidRequestException)value);
+ }
+ break;
+
}
}
@@ -18476,6 +18533,9 @@ public class Cassandra {
case SUCCESS:
return getSuccess();
+ case IRE:
+ return getIre();
+
}
throw new IllegalStateException();
}
@@ -18489,6 +18549,8 @@ public class Cassandra {
switch (field) {
case SUCCESS:
return isSetSuccess();
+ case IRE:
+ return isSetIre();
}
throw new IllegalStateException();
}
@@ -18519,6 +18581,15 @@ public class Cassandra {
return false;
}
+ boolean this_present_ire = true && this.isSetIre();
+ boolean that_present_ire = true && that.isSetIre();
+ if (this_present_ire || that_present_ire) {
+ if (!(this_present_ire && that_present_ire))
+ return false;
+ if (!this.ire.equals(that.ire))
+ return false;
+ }
+
return true;
}
@@ -18544,6 +18615,15 @@ public class Cassandra {
return lastComparison;
}
}
+ lastComparison =
Boolean.valueOf(isSetIre()).compareTo(typedOther.isSetIre());
+ if (lastComparison != 0) {
+ return lastComparison;
+ }
+ if (isSetIre()) { lastComparison = TBaseHelper.compareTo(ire,
typedOther.ire);
+ if (lastComparison != 0) {
+ return lastComparison;
+ }
+ }
return 0;
}
@@ -18575,6 +18655,14 @@ public class Cassandra {
TProtocolUtil.skip(iprot, field.type);
}
break;
+ case 1: // IRE
+ if (field.type == TType.STRUCT) {
+ this.ire = new InvalidRequestException();
+ this.ire.read(iprot);
+ } else {
+ TProtocolUtil.skip(iprot, field.type);
+ }
+ break;
default:
TProtocolUtil.skip(iprot, field.type);
}
@@ -18600,6 +18688,10 @@ public class Cassandra {
oprot.writeListEnd();
}
oprot.writeFieldEnd();
+ } else if (this.isSetIre()) {
+ oprot.writeFieldBegin(IRE_FIELD_DESC);
+ this.ire.write(oprot);
+ oprot.writeFieldEnd();
}
oprot.writeFieldStop();
oprot.writeStructEnd();
@@ -18617,6 +18709,14 @@ public class Cassandra {
sb.append(this.success);
}
first = false;
+ if (!first) sb.append(", ");
+ sb.append("ire:");
+ if (this.ire == null) {
+ sb.append("null");
+ } else {
+ sb.append(this.ire);
+ }
+ first = false;
sb.append(")");
return sb.toString();
}
Modified:
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/hadoop/ColumnFamilyInputFormat.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/hadoop/ColumnFamilyInputFormat.java?rev=949261&r1=949260&r2=949261&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/hadoop/ColumnFamilyInputFormat.java
(original)
+++
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/hadoop/ColumnFamilyInputFormat.java
Fri May 28 19:00:12 2010
@@ -213,6 +213,10 @@ public class ColumnFamilyInputFormat ext
{
throw new RuntimeException(e);
}
+ catch (InvalidRequestException e)
+ {
+ throw new RuntimeException(e);
+ }
return map;
}
Modified:
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/thrift/CassandraServer.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/thrift/CassandraServer.java?rev=949261&r1=949260&r2=949261&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/thrift/CassandraServer.java
(original)
+++
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/thrift/CassandraServer.java
Fri May 28 19:00:12 2010
@@ -622,8 +622,10 @@ public class CassandraServer implements
return Constants.VERSION;
}
- public List<TokenRange> describe_ring(String keyspace)
+ public List<TokenRange> describe_ring(String keyspace)throws
InvalidRequestException
{
+ if (!DatabaseDescriptor.getNonSystemTables().contains(keyspace))
+ throw new InvalidRequestException("There is no ring for the
keyspace: " + keyspace);
List<TokenRange> ranges = new ArrayList<TokenRange>();
Token.TokenFactory tf =
StorageService.getPartitioner().getTokenFactory();
for (Map.Entry<Range, List<String>> entry :
StorageService.instance.getRangeToEndPointMap(keyspace).entrySet())
Modified: cassandra/branches/cassandra-0.6/test/system/test_server.py
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/test/system/test_server.py?rev=949261&r1=949260&r2=949261&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/test/system/test_server.py (original)
+++ cassandra/branches/cassandra-0.6/test/system/test_server.py Fri May 28
19:00:12 2010
@@ -923,3 +923,8 @@ class TestMutations(CassandraTester):
def test_describe_ring(self):
assert list(client.describe_ring('Keyspace1'))[0].endpoints ==
['127.0.0.1']
+
+ def test_describe_ring_on_invalid_keyspace(self):
+ def req():
+ client.describe_ring('system')
+ _expect_exception(req, InvalidRequestException)