You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sl...@apache.org on 2013/01/21 17:05:07 UTC

[1/2] git commit: Gentler version for CASSANDRA-5172

Gentler version for CASSANDRA-5172


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/85443ec5
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/85443ec5
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/85443ec5

Branch: refs/heads/trunk
Commit: 85443ec5c160e1778cc49edb791f48ad3fa5b535
Parents: a330716
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Mon Jan 21 17:04:39 2013 +0100
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Mon Jan 21 17:04:39 2013 +0100

----------------------------------------------------------------------
 NEWS.txt                                           |   10 ++--
 .../org/apache/cassandra/service/ClientState.java  |    2 +-
 .../apache/cassandra/thrift/CassandraServer.java   |   45 +++++++++++++-
 3 files changed, 47 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/85443ec5/NEWS.txt
----------------------------------------------------------------------
diff --git a/NEWS.txt b/NEWS.txt
index e1e842c..072b647 100644
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -21,11 +21,11 @@ Upgrading
       representation), but the new dateOf method can be used instead. Please
       refer to the reference documentation (http://cassandra.apache.org/doc/cql3/CQL.html)
       for more detail.
-    - Calling the set_cql_version of the thrift interface with a version that
-      don't start with 2 now raise an error (instead of being a no-op). Not
-      raising an error in that case makes it hard for CQL3 client that haven't
-      upgraded to use the new thrift CQL3 methods to understand what is going
-      wrong.
+    - For client implementors: CQL3 client using the thrift interface should
+      use the new execute_cql3_query, prepare_cql3_query and execute_prepared_cql3_query
+      since 1.2.0. However, Cassandra 1.2.0 was not complaining if CQL3 was set
+      through set_cql_version but the now CQL2 only methods were used. This is
+      now the case.
 
 
 1.2

http://git-wip-us.apache.org/repos/asf/cassandra/blob/85443ec5/src/java/org/apache/cassandra/service/ClientState.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/ClientState.java b/src/java/org/apache/cassandra/service/ClientState.java
index d0cf0ba..d7b394a 100644
--- a/src/java/org/apache/cassandra/service/ClientState.java
+++ b/src/java/org/apache/cassandra/service/ClientState.java
@@ -63,7 +63,7 @@ public class ClientState
     private volatile AuthenticatedUser user;
     private String keyspace;
 
-    private SemanticVersion cqlVersion = DEFAULT_CQL_VERSION;
+    private SemanticVersion cqlVersion;
 
     // internalCall is used to mark ClientState as used by some internal component
     // that should have an ability to modify system keyspace

http://git-wip-us.apache.org/repos/asf/cassandra/blob/85443ec5/src/java/org/apache/cassandra/thrift/CassandraServer.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/thrift/CassandraServer.java b/src/java/org/apache/cassandra/thrift/CassandraServer.java
index ce533f4..557ba2c 100644
--- a/src/java/org/apache/cassandra/thrift/CassandraServer.java
+++ b/src/java/org/apache/cassandra/thrift/CassandraServer.java
@@ -59,6 +59,7 @@ import org.apache.cassandra.service.*;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.SemanticVersion;
 import org.apache.cassandra.utils.UUIDGen;
 import org.apache.thrift.TException;
 
@@ -1658,9 +1659,32 @@ public class CassandraServer implements Cassandra.Iface
         return queryString;
     }
 
+    private void validateCQLVersion(int major) throws InvalidRequestException
+    {
+        /*
+         * The rules are:
+         *   - If no version are set, we don't validate anything. The reason is
+         *     that 1) old CQL2 client might not have called set_cql_version
+         *     and 2) some client may have removed the set_cql_version for CQL3
+         *     when updating to 1.2.0. A CQL3 client upgrading from pre-1.2
+         *     shouldn't be in that case however since set_cql_version uses to
+         *     be mandatory (for CQL3).
+         *   - Otherwise, checks the major matches whatever was set.
+         */
+        SemanticVersion versionSet = state().getCQLVersion();
+        if (versionSet == null)
+            return;
+
+        if (versionSet.major != major)
+            throw new InvalidRequestException(
+                "Cannot execute/prepare CQL" + major + " statement since the CQL has been set to CQL" + versionSet.major
+              + "(This might mean your client hasn't been upgraded correctly to use the new CQL3 methods introduced in Cassandra 1.2+).");
+    }
+
     public CqlResult execute_cql_query(ByteBuffer query, Compression compression)
     throws InvalidRequestException, UnavailableException, TimedOutException, SchemaDisagreementException, TException
     {
+        validateCQLVersion(2);
         try
         {
             String queryString = uncompress(query, compression);
@@ -1694,6 +1718,7 @@ public class CassandraServer implements Cassandra.Iface
     public CqlResult execute_cql3_query(ByteBuffer query, Compression compression, ConsistencyLevel cLevel)
     throws InvalidRequestException, UnavailableException, TimedOutException, SchemaDisagreementException, TException
     {
+        validateCQLVersion(3);
         try
         {
             String queryString = uncompress(query, compression);
@@ -1731,6 +1756,8 @@ public class CassandraServer implements Cassandra.Iface
         if (logger.isDebugEnabled())
             logger.debug("prepare_cql_query");
 
+        validateCQLVersion(2);
+
         try
         {
             ThriftClientState cState = state();
@@ -1749,6 +1776,8 @@ public class CassandraServer implements Cassandra.Iface
         if (logger.isDebugEnabled())
             logger.debug("prepare_cql3_query");
 
+        validateCQLVersion(3);
+
         try
         {
             ThriftClientState cState = state();
@@ -1764,6 +1793,8 @@ public class CassandraServer implements Cassandra.Iface
     public CqlResult execute_prepared_cql_query(int itemId, List<ByteBuffer> bindVariables)
     throws InvalidRequestException, UnavailableException, TimedOutException, SchemaDisagreementException, TException
     {
+        validateCQLVersion(2);
+
         if (startSessionIfRequested())
         {
             // TODO we don't have [typed] access to CQL bind variables here.  CASSANDRA-4560 is open to add support.
@@ -1803,6 +1834,8 @@ public class CassandraServer implements Cassandra.Iface
     public CqlResult execute_prepared_cql3_query(int itemId, List<ByteBuffer> bindVariables, ConsistencyLevel cLevel)
     throws InvalidRequestException, UnavailableException, TimedOutException, SchemaDisagreementException, TException
     {
+        validateCQLVersion(3);
+
         if (startSessionIfRequested())
         {
             // TODO we don't have [typed] access to CQL bind variables here.  CASSANDRA-4560 is open to add support.
@@ -1850,10 +1883,14 @@ public class CassandraServer implements Cassandra.Iface
      */
     public void set_cql_version(String version) throws InvalidRequestException
     {
-        if (version.trim().startsWith("2"))
-            return;
-
-        throw new InvalidRequestException("Invalid use of the CQL thrift interface. This most likely mean the client you are using has not been updated for Cassandra 1.2");
+        try
+        {
+            state().setCQLVersion(version);
+        }
+        catch (org.apache.cassandra.exceptions.InvalidRequestException e)
+        {
+            throw new InvalidRequestException(e.getMessage());
+        }
     }
 
     public ByteBuffer trace_next_query() throws TException