From f795534553168bbe4023ca324c07e4cde5106a6b Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Fri, 3 Sep 2010 16:23:57 +0000 Subject: [PATCH] change list keys to set in multiget. patch by Jon Hermes; reviewed by jbellis for CASSANDRA-1329 git-svn-id: https://svn.apache.org/repos/asf/cassandra/trunk@992355 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES.txt | 1 + NEWS.txt | 3 + interface/cassandra.thrift | 6 +- .../apache/cassandra/thrift/Cassandra.java | 92 +++++++++---------- .../apache/cassandra/thrift/Constants.java | 2 +- .../cassandra/thrift/CassandraServer.java | 9 +- 6 files changed, 59 insertions(+), 54 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index bde1f5c8e5..bcf2845161 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -44,6 +44,7 @@ dev * add CMSInitiatingOccupancyFraction=75 and UseCMSInitiatingOccupancyOnly to default JVM options * decrease jvm heap for cassandra-cli (CASSANDRA-1446) + * change multiget key collection from list to set (CASSANDRA-1329) 0.7-beta1 diff --git a/NEWS.txt b/NEWS.txt index 80f2a4dd21..ac5bf56a2c 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -57,6 +57,9 @@ Upgrading Thrift API ---------- + - Multiget key collection is now a set, rather than a list + (for dynamic languages, this is a non-issue since really any + iterable is accepted) - Row keys are now bytes: keys stored by versions prior to 0.7.0 will be returned as UTF-8 encoded bytes. OrderPreservingPartitioner and CollatingOrderPreservingPartitioner continue to expect that keys contain diff --git a/interface/cassandra.thrift b/interface/cassandra.thrift index f0f19926a5..d047a6c5fc 100644 --- a/interface/cassandra.thrift +++ b/interface/cassandra.thrift @@ -46,7 +46,7 @@ namespace rb CassandraThrift # for every edit that doesn't result in a change to major/minor. # # See the Semantic Versioning Specification (SemVer) http://semver.org. -const string VERSION = "12.1.0" +const string VERSION = "13.0.0" # @@ -406,7 +406,7 @@ service Cassandra { /** Performs a get_slice for column_parent and predicate for the given keys in parallel. */ - map> multiget_slice(1:required list keys, + map> multiget_slice(1:required set keys, 2:required ColumnParent column_parent, 3:required SlicePredicate predicate, 4:required ConsistencyLevel consistency_level=ONE) @@ -415,7 +415,7 @@ service Cassandra { /** Perform a get_count in parallel on the given list keys. The return value maps keys to the count found. */ - map multiget_count(1:required list keys, + map multiget_count(1:required set keys, 2:required ColumnParent column_parent, 3:required SlicePredicate predicate, 4:required ConsistencyLevel consistency_level=ONE) diff --git a/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java b/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java index 29b81dd727..39c2801722 100644 --- a/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java +++ b/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java @@ -94,7 +94,7 @@ public class Cassandra { * @param predicate * @param consistency_level */ - public Map> multiget_slice(List keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) throws InvalidRequestException, UnavailableException, TimedOutException, TException; + public Map> multiget_slice(Set keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) throws InvalidRequestException, UnavailableException, TimedOutException, TException; /** * Perform a get_count in parallel on the given list keys. The return value maps keys to the count found. @@ -104,7 +104,7 @@ public class Cassandra { * @param predicate * @param consistency_level */ - public Map multiget_count(List keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) throws InvalidRequestException, UnavailableException, TimedOutException, TException; + public Map multiget_count(Set keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) throws InvalidRequestException, UnavailableException, TimedOutException, TException; /** * returns a subset of columns for a contiguous range of keys. @@ -292,9 +292,9 @@ public class Cassandra { public void get_count(byte[] key, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level, AsyncMethodCallback resultHandler) throws TException; - public void multiget_slice(List keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level, AsyncMethodCallback resultHandler) throws TException; + public void multiget_slice(Set keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level, AsyncMethodCallback resultHandler) throws TException; - public void multiget_count(List keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level, AsyncMethodCallback resultHandler) throws TException; + public void multiget_count(Set keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level, AsyncMethodCallback resultHandler) throws TException; public void get_range_slices(ColumnParent column_parent, SlicePredicate predicate, KeyRange range, ConsistencyLevel consistency_level, AsyncMethodCallback resultHandler) throws TException; @@ -596,13 +596,13 @@ public class Cassandra { throw new TApplicationException(TApplicationException.MISSING_RESULT, "get_count failed: unknown result"); } - public Map> multiget_slice(List keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) throws InvalidRequestException, UnavailableException, TimedOutException, TException + public Map> multiget_slice(Set keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) throws InvalidRequestException, UnavailableException, TimedOutException, TException { send_multiget_slice(keys, column_parent, predicate, consistency_level); return recv_multiget_slice(); } - public void send_multiget_slice(List keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) throws TException + public void send_multiget_slice(Set keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) throws TException { oprot_.writeMessageBegin(new TMessage("multiget_slice", TMessageType.CALL, ++seqid_)); multiget_slice_args args = new multiget_slice_args(); @@ -644,13 +644,13 @@ public class Cassandra { throw new TApplicationException(TApplicationException.MISSING_RESULT, "multiget_slice failed: unknown result"); } - public Map multiget_count(List keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) throws InvalidRequestException, UnavailableException, TimedOutException, TException + public Map multiget_count(Set keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) throws InvalidRequestException, UnavailableException, TimedOutException, TException { send_multiget_count(keys, column_parent, predicate, consistency_level); return recv_multiget_count(); } - public void send_multiget_count(List keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) throws TException + public void send_multiget_count(Set keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) throws TException { oprot_.writeMessageBegin(new TMessage("multiget_count", TMessageType.CALL, ++seqid_)); multiget_count_args args = new multiget_count_args(); @@ -1689,18 +1689,18 @@ public class Cassandra { } } - public void multiget_slice(List keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level, AsyncMethodCallback resultHandler) throws TException { + public void multiget_slice(Set keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level, AsyncMethodCallback resultHandler) throws TException { checkReady(); multiget_slice_call method_call = new multiget_slice_call(keys, column_parent, predicate, consistency_level, resultHandler, this, protocolFactory, transport); manager.call(method_call); } public static class multiget_slice_call extends TAsyncMethodCall { - private List keys; + private Set keys; private ColumnParent column_parent; private SlicePredicate predicate; private ConsistencyLevel consistency_level; - public multiget_slice_call(List keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level, AsyncMethodCallback resultHandler, TAsyncClient client, TProtocolFactory protocolFactory, TNonblockingTransport transport) throws TException { + public multiget_slice_call(Set keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level, AsyncMethodCallback resultHandler, TAsyncClient client, TProtocolFactory protocolFactory, TNonblockingTransport transport) throws TException { super(client, protocolFactory, transport, resultHandler, false); this.keys = keys; this.column_parent = column_parent; @@ -1729,18 +1729,18 @@ public class Cassandra { } } - public void multiget_count(List keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level, AsyncMethodCallback resultHandler) throws TException { + public void multiget_count(Set keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level, AsyncMethodCallback resultHandler) throws TException { checkReady(); multiget_count_call method_call = new multiget_count_call(keys, column_parent, predicate, consistency_level, resultHandler, this, protocolFactory, transport); manager.call(method_call); } public static class multiget_count_call extends TAsyncMethodCall { - private List keys; + private Set keys; private ColumnParent column_parent; private SlicePredicate predicate; private ConsistencyLevel consistency_level; - public multiget_count_call(List keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level, AsyncMethodCallback resultHandler, TAsyncClient client, TProtocolFactory protocolFactory, TNonblockingTransport transport) throws TException { + public multiget_count_call(Set keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level, AsyncMethodCallback resultHandler, TAsyncClient client, TProtocolFactory protocolFactory, TNonblockingTransport transport) throws TException { super(client, protocolFactory, transport, resultHandler, false); this.keys = keys; this.column_parent = column_parent; @@ -8155,12 +8155,12 @@ public class Cassandra { public static class multiget_slice_args implements TBase, java.io.Serializable, Cloneable { private static final TStruct STRUCT_DESC = new TStruct("multiget_slice_args"); - private static final TField KEYS_FIELD_DESC = new TField("keys", TType.LIST, (short)1); + private static final TField KEYS_FIELD_DESC = new TField("keys", TType.SET, (short)1); private static final TField COLUMN_PARENT_FIELD_DESC = new TField("column_parent", TType.STRUCT, (short)2); private static final TField PREDICATE_FIELD_DESC = new TField("predicate", TType.STRUCT, (short)3); private static final TField CONSISTENCY_LEVEL_FIELD_DESC = new TField("consistency_level", TType.I32, (short)4); - public List keys; + public Set keys; public ColumnParent column_parent; public SlicePredicate predicate; /** @@ -8246,7 +8246,7 @@ public class Cassandra { static { Map<_Fields, FieldMetaData> tmpMap = new EnumMap<_Fields, FieldMetaData>(_Fields.class); tmpMap.put(_Fields.KEYS, new FieldMetaData("keys", TFieldRequirementType.REQUIRED, - new ListMetaData(TType.LIST, + new SetMetaData(TType.SET, new FieldValueMetaData(TType.STRING)))); tmpMap.put(_Fields.COLUMN_PARENT, new FieldMetaData("column_parent", TFieldRequirementType.REQUIRED, new StructMetaData(TType.STRUCT, ColumnParent.class))); @@ -8264,7 +8264,7 @@ public class Cassandra { } public multiget_slice_args( - List keys, + Set keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) @@ -8281,7 +8281,7 @@ public class Cassandra { */ public multiget_slice_args(multiget_slice_args other) { if (other.isSetKeys()) { - List __this__keys = new ArrayList(); + Set __this__keys = new HashSet(); for (byte[] other_element : other.keys) { byte[] temp_binary_element = new byte[other_element.length]; System.arraycopy(other_element, 0, temp_binary_element, 0, other_element.length); @@ -8319,16 +8319,16 @@ public class Cassandra { public void addToKeys(byte[] elem) { if (this.keys == null) { - this.keys = new ArrayList(); + this.keys = new HashSet(); } this.keys.add(elem); } - public List getKeys() { + public Set getKeys() { return this.keys; } - public multiget_slice_args setKeys(List keys) { + public multiget_slice_args setKeys(Set keys) { this.keys = keys; return this; } @@ -8434,7 +8434,7 @@ public class Cassandra { if (value == null) { unsetKeys(); } else { - setKeys((List)value); + setKeys((Set)value); } break; @@ -8625,17 +8625,17 @@ public class Cassandra { } switch (field.id) { case 1: // KEYS - if (field.type == TType.LIST) { + if (field.type == TType.SET) { { - TList _list42 = iprot.readListBegin(); - this.keys = new ArrayList(_list42.size); - for (int _i43 = 0; _i43 < _list42.size; ++_i43) + TSet _set42 = iprot.readSetBegin(); + this.keys = new HashSet(2*_set42.size); + for (int _i43 = 0; _i43 < _set42.size; ++_i43) { byte[] _elem44; _elem44 = iprot.readBinary(); this.keys.add(_elem44); } - iprot.readListEnd(); + iprot.readSetEnd(); } } else { TProtocolUtil.skip(iprot, field.type); @@ -8682,12 +8682,12 @@ public class Cassandra { if (this.keys != null) { oprot.writeFieldBegin(KEYS_FIELD_DESC); { - oprot.writeListBegin(new TList(TType.STRING, this.keys.size())); + oprot.writeSetBegin(new TSet(TType.STRING, this.keys.size())); for (byte[] _iter45 : this.keys) { oprot.writeBinary(_iter45); } - oprot.writeListEnd(); + oprot.writeSetEnd(); } oprot.writeFieldEnd(); } @@ -9383,12 +9383,12 @@ public class Cassandra { public static class multiget_count_args implements TBase, java.io.Serializable, Cloneable { private static final TStruct STRUCT_DESC = new TStruct("multiget_count_args"); - private static final TField KEYS_FIELD_DESC = new TField("keys", TType.LIST, (short)1); + private static final TField KEYS_FIELD_DESC = new TField("keys", TType.SET, (short)1); private static final TField COLUMN_PARENT_FIELD_DESC = new TField("column_parent", TType.STRUCT, (short)2); private static final TField PREDICATE_FIELD_DESC = new TField("predicate", TType.STRUCT, (short)3); private static final TField CONSISTENCY_LEVEL_FIELD_DESC = new TField("consistency_level", TType.I32, (short)4); - public List keys; + public Set keys; public ColumnParent column_parent; public SlicePredicate predicate; /** @@ -9474,7 +9474,7 @@ public class Cassandra { static { Map<_Fields, FieldMetaData> tmpMap = new EnumMap<_Fields, FieldMetaData>(_Fields.class); tmpMap.put(_Fields.KEYS, new FieldMetaData("keys", TFieldRequirementType.REQUIRED, - new ListMetaData(TType.LIST, + new SetMetaData(TType.SET, new FieldValueMetaData(TType.STRING)))); tmpMap.put(_Fields.COLUMN_PARENT, new FieldMetaData("column_parent", TFieldRequirementType.REQUIRED, new StructMetaData(TType.STRUCT, ColumnParent.class))); @@ -9492,7 +9492,7 @@ public class Cassandra { } public multiget_count_args( - List keys, + Set keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) @@ -9509,7 +9509,7 @@ public class Cassandra { */ public multiget_count_args(multiget_count_args other) { if (other.isSetKeys()) { - List __this__keys = new ArrayList(); + Set __this__keys = new HashSet(); for (byte[] other_element : other.keys) { byte[] temp_binary_element = new byte[other_element.length]; System.arraycopy(other_element, 0, temp_binary_element, 0, other_element.length); @@ -9547,16 +9547,16 @@ public class Cassandra { public void addToKeys(byte[] elem) { if (this.keys == null) { - this.keys = new ArrayList(); + this.keys = new HashSet(); } this.keys.add(elem); } - public List getKeys() { + public Set getKeys() { return this.keys; } - public multiget_count_args setKeys(List keys) { + public multiget_count_args setKeys(Set keys) { this.keys = keys; return this; } @@ -9662,7 +9662,7 @@ public class Cassandra { if (value == null) { unsetKeys(); } else { - setKeys((List)value); + setKeys((Set)value); } break; @@ -9853,17 +9853,17 @@ public class Cassandra { } switch (field.id) { case 1: // KEYS - if (field.type == TType.LIST) { + if (field.type == TType.SET) { { - TList _list55 = iprot.readListBegin(); - this.keys = new ArrayList(_list55.size); - for (int _i56 = 0; _i56 < _list55.size; ++_i56) + TSet _set55 = iprot.readSetBegin(); + this.keys = new HashSet(2*_set55.size); + for (int _i56 = 0; _i56 < _set55.size; ++_i56) { byte[] _elem57; _elem57 = iprot.readBinary(); this.keys.add(_elem57); } - iprot.readListEnd(); + iprot.readSetEnd(); } } else { TProtocolUtil.skip(iprot, field.type); @@ -9910,12 +9910,12 @@ public class Cassandra { if (this.keys != null) { oprot.writeFieldBegin(KEYS_FIELD_DESC); { - oprot.writeListBegin(new TList(TType.STRING, this.keys.size())); + oprot.writeSetBegin(new TSet(TType.STRING, this.keys.size())); for (byte[] _iter58 : this.keys) { oprot.writeBinary(_iter58); } - oprot.writeListEnd(); + oprot.writeSetEnd(); } oprot.writeFieldEnd(); } diff --git a/interface/thrift/gen-java/org/apache/cassandra/thrift/Constants.java b/interface/thrift/gen-java/org/apache/cassandra/thrift/Constants.java index e4e32d6091..1d34addb8f 100644 --- a/interface/thrift/gen-java/org/apache/cassandra/thrift/Constants.java +++ b/interface/thrift/gen-java/org/apache/cassandra/thrift/Constants.java @@ -42,6 +42,6 @@ import org.slf4j.LoggerFactory; public class Constants { - public static final String VERSION = "12.1.0"; + public static final String VERSION = "13.0.0"; } diff --git a/src/java/org/apache/cassandra/thrift/CassandraServer.java b/src/java/org/apache/cassandra/thrift/CassandraServer.java index 2ebdb8e46b..f1d2f32011 100644 --- a/src/java/org/apache/cassandra/thrift/CassandraServer.java +++ b/src/java/org/apache/cassandra/thrift/CassandraServer.java @@ -252,10 +252,11 @@ public class CassandraServer implements Cassandra.Iface logger.debug("get_slice"); clientState.hasKeyspaceAccess(Permission.READ_VALUE); - return multigetSliceInternal(clientState.getKeyspace(), Arrays.asList(key), column_parent, predicate, consistency_level).get(key); + + return multigetSliceInternal(clientState.getKeyspace(), Collections.singleton(key), column_parent, predicate, consistency_level).get(key); } - public Map> multiget_slice(List keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) + public Map> multiget_slice(Set keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) throws InvalidRequestException, UnavailableException, TimedOutException { if (logger.isDebugEnabled()) @@ -266,7 +267,7 @@ public class CassandraServer implements Cassandra.Iface return multigetSliceInternal(clientState.getKeyspace(), keys, column_parent, predicate, consistency_level); } - private Map> multigetSliceInternal(String keyspace, List keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) + private Map> multigetSliceInternal(String keyspace, Set keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) throws InvalidRequestException, UnavailableException, TimedOutException { ThriftValidation.validateColumnParent(keyspace, column_parent); @@ -333,7 +334,7 @@ public class CassandraServer implements Cassandra.Iface return get_slice(key, column_parent, predicate, consistency_level).size(); } - public Map multiget_count(List keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) + public Map multiget_count(Set keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) throws InvalidRequestException, UnavailableException, TimedOutException { if (logger.isDebugEnabled())