You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ja...@apache.org on 2015/08/10 17:24:26 UTC

cassandra git commit: Fix for Row deletion bug in Materialized Views

Repository: cassandra
Updated Branches:
  refs/heads/cassandra-3.0 45c04b727 -> 2fcfc7c58


Fix for Row deletion bug in Materialized Views

patch by carl; reviewed by tjake for CASSANDRA-10014


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

Branch: refs/heads/cassandra-3.0
Commit: 2fcfc7c58aafb59b51580a7fdef5f849f38dc637
Parents: 45c04b7
Author: Carl Yeksigian <ca...@apache.org>
Authored: Fri Aug 7 14:32:20 2015 -0400
Committer: T Jake Luciani <ja...@apache.org>
Committed: Mon Aug 10 11:23:16 2015 -0400

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../cassandra/db/view/MaterializedView.java     |  7 +++-
 .../cassandra/cql3/MaterializedViewTest.java    | 43 ++++++++++++++++++++
 3 files changed, 50 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/2fcfc7c5/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 639dd59..c7d466a 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 3.0.0-beta1
+ * Fix row deletion bug for Materialized Views (CASSANDRA-10014)
  * Support mixed-version clusters with Cassandra 2.1 and 2.2 (CASSANDRA-9704)
  * Fix multiple slices on RowSearchers (CASSANDRA-10002)
  * Fix bug in merging of collections (CASSANDRA-10001)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/2fcfc7c5/src/java/org/apache/cassandra/db/view/MaterializedView.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/view/MaterializedView.java b/src/java/org/apache/cassandra/db/view/MaterializedView.java
index 06c4dc2..c953d5f 100644
--- a/src/java/org/apache/cassandra/db/view/MaterializedView.java
+++ b/src/java/org/apache/cassandra/db/view/MaterializedView.java
@@ -216,9 +216,14 @@ public class MaterializedView
         if (!partition.deletionInfo().isLive())
             return true;
 
-        // Check whether the update touches any of the columns included in the view
+        // Check each row for deletion or update
         for (Row row : partition)
         {
+            if (row.hasComplexDeletion())
+                return true;
+            if (!row.deletion().isLive())
+                return true;
+
             for (ColumnData data : row)
             {
                 if (getViewCfs().metadata.getColumnDefinition(data.column().name) != null)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/2fcfc7c5/test/unit/org/apache/cassandra/cql3/MaterializedViewTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cql3/MaterializedViewTest.java b/test/unit/org/apache/cassandra/cql3/MaterializedViewTest.java
index 78c40e2..faff229 100644
--- a/test/unit/org/apache/cassandra/cql3/MaterializedViewTest.java
+++ b/test/unit/org/apache/cassandra/cql3/MaterializedViewTest.java
@@ -90,6 +90,49 @@ public class MaterializedViewTest extends CQLTester
         }
     }
 
+    @Test
+    public void testPartitionTombstone() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k1 int, c1 int , val int, PRIMARY KEY (k1))");
+
+        execute("USE " + keyspace());
+        executeNet(protocolVersion, "USE " + keyspace());
+
+        createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT k1 FROM %%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY KEY (val, k1, c1)");
+
+        updateMV("INSERT INTO %s (k1, c1, val) VALUES (1, 2, 200)");
+        updateMV("INSERT INTO %s (k1, c1, val) VALUES (1, 3, 300)");
+
+        Assert.assertEquals(1, execute("select * from %s").size());
+        Assert.assertEquals(1, execute("select * from view1").size());
+
+        updateMV("DELETE FROM %s WHERE k1 = 1");
+
+        Assert.assertEquals(0, execute("select * from %s").size());
+        Assert.assertEquals(0, execute("select * from view1").size());
+    }
+
+    @Test
+    public void testClusteringKeyTombstone() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k1 int, c1 int , val int, PRIMARY KEY (k1, c1))");
+
+        execute("USE " + keyspace());
+        executeNet(protocolVersion, "USE " + keyspace());
+
+        createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT k1 FROM %%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY KEY (val, k1, c1)");
+
+        updateMV("INSERT INTO %s (k1, c1, val) VALUES (1, 2, 200)");
+        updateMV("INSERT INTO %s (k1, c1, val) VALUES (1, 3, 300)");
+
+        Assert.assertEquals(2, execute("select * from %s").size());
+        Assert.assertEquals(2, execute("select * from view1").size());
+
+        updateMV("DELETE FROM %s WHERE k1 = 1 and c1 = 3");
+
+        Assert.assertEquals(1, execute("select * from %s").size());
+        Assert.assertEquals(1, execute("select * from view1").size());
+    }
 
     @Test
     public void testAccessAndSchema() throws Throwable