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 2016/09/13 08:52:58 UTC

[3/8] cassandra git commit: Change behaviour for LWTs on static columns will null and non-existing values.

Change behaviour for LWTs on static columns will null and non-existing values.

Patch by Alex Petrov; reviewed by TBD for CASSANDRA-12060.


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

Branch: refs/heads/12060-3.0-v2
Commit: 94e1d56c0a478f23d8626951a82e7a1a43a43bbb
Parents: 8b5b185
Author: Alex Petrov <ol...@gmail.com>
Authored: Wed Aug 10 13:15:30 2016 +0200
Committer: Alex Petrov <ol...@gmail.com>
Committed: Wed Aug 17 15:30:21 2016 +0200

----------------------------------------------------------------------
 .../cassandra/cql3/statements/CQL3CasRequest.java       | 12 ++++++++++--
 .../cql3/statements/ModificationStatement.java          |  5 ++++-
 src/java/org/apache/cassandra/service/StorageProxy.java |  2 +-
 3 files changed, 15 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/94e1d56c/src/java/org/apache/cassandra/cql3/statements/CQL3CasRequest.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/CQL3CasRequest.java b/src/java/org/apache/cassandra/cql3/statements/CQL3CasRequest.java
index 9564005..5362e8f 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CQL3CasRequest.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CQL3CasRequest.java
@@ -28,6 +28,8 @@ import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.filter.ClusteringIndexSliceFilter;
 import org.apache.cassandra.db.filter.ColumnFilter;
+import org.apache.cassandra.db.filter.DataLimits;
+import org.apache.cassandra.db.filter.RowFilter;
 import org.apache.cassandra.db.partitions.FilteredPartition;
 import org.apache.cassandra.db.partitions.Partition;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
@@ -123,7 +125,9 @@ public class CQL3CasRequest implements CASRequest
         // if an insert only static columns, then the existence condition applies only to the
         // static columns themselves, and so we don't want to include regular columns in that
         // case.
-        if (hasExists)
+        // If static row is updated, in order to maintain backward compatibility with 2.x
+        // we have to read at least one row to return failure result with filled clustering.
+        if (hasExists || updatesStaticRow)
         {
             PartitionColumns allColumns = cfm.partitionColumns();
             Columns statics = updatesStaticRow ? allColumns.statics : Columns.NONE;
@@ -144,10 +148,14 @@ public class CQL3CasRequest implements CASRequest
         {
             if (clustering != Clustering.STATIC_CLUSTERING)
                 builder.add(Slice.make(clustering));
+            // In order to make distinction between non-existing partition and partition without statics on static condition,
+            // we have to read at least one row (see #12060).
+            else if (conditions.size() == 1)
+                builder.add(Slice.ALL);
         }
 
         ClusteringIndexSliceFilter filter = new ClusteringIndexSliceFilter(builder.build(), false);
-        return SinglePartitionReadCommand.create(cfm, nowInSec, key, ColumnFilter.selection(columnsToRead()), filter);
+        return SinglePartitionReadCommand.create(false, cfm, nowInSec, ColumnFilter.selection(columnsToRead()), RowFilter.NONE, DataLimits.cqlLimits(conditions.size()), key, filter);
     }
 
     public boolean appliesTo(FilteredPartition current) throws InvalidRequestException

http://git-wip-us.apache.org/repos/asf/cassandra/blob/94e1d56c/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
index 01c2ad1..7094853 100644
--- a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
@@ -587,8 +587,11 @@ public abstract class ModificationStatement implements CQLStatement
             current = FilteredPartition.create(PartitionIterators.getOnlyElement(iter, readCommand));
         }
 
-        if (!request.appliesTo(current))
+        // If partition is effectively empty (no rows, no statics, not live), we pass null to indicate it does not exist
+        if (!request.appliesTo(current.isEmpty() ? null : current))
+        {
             return current.rowIterator();
+        }
 
         PartitionUpdate updates = request.makeUpdates(current);
         updates = TriggerExecutor.instance.execute(updates);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/94e1d56c/src/java/org/apache/cassandra/service/StorageProxy.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java
index 8a151f2..1550bb0 100644
--- a/src/java/org/apache/cassandra/service/StorageProxy.java
+++ b/src/java/org/apache/cassandra/service/StorageProxy.java
@@ -251,7 +251,7 @@ public class StorageProxy implements StorageProxyMBean
                     current = FilteredPartition.create(rowIter);
                 }
 
-                if (!request.appliesTo(current))
+                if (!request.appliesTo(current.isEmpty() ? null : current))
                 {
                     Tracing.trace("CAS precondition does not match current values {}", current);
                     casWriteMetrics.conditionNotMet.inc();