You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by pa...@apache.org on 2017/09/22 14:44:24 UTC

[2/6] cassandra git commit: Fix missing original update in TriggerExecutor

Fix missing original update in TriggerExecutor

Patch by Jason Stack; Reviewed by Paulo Motta for CASSANDRA-13894


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

Branch: refs/heads/cassandra-3.11
Commit: 51e6f2446e71c8bd2ce89480b7d30d5b9ed1546e
Parents: 2b897d2
Author: Zhao Yang <zh...@gmail.com>
Authored: Fri Sep 22 17:04:05 2017 +0800
Committer: Paulo Motta <pa...@apache.org>
Committed: Fri Sep 22 09:39:29 2017 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../cassandra/triggers/TriggerExecutor.java     |  7 ++++-
 .../cassandra/triggers/TriggerExecutorTest.java | 23 ++++++++++++---
 .../apache/cassandra/triggers/TriggersTest.java | 30 ++++++++++++--------
 4 files changed, 44 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/51e6f244/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 91f5a51..68da81a 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 3.0.15
+ * Fix missing original update in TriggerExecutor (CASSANDRA-13894)
  * Remove non-rpc-ready nodes from counter leader candidates (CASSANDRA-13043)
  * Improve short read protection performance (CASSANDRA-13794)
  * Fix sstable reader to support range-tombstone-marker for multi-slices (CASSANDRA-13787)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/51e6f244/src/java/org/apache/cassandra/triggers/TriggerExecutor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/triggers/TriggerExecutor.java b/src/java/org/apache/cassandra/triggers/TriggerExecutor.java
index 40d4094..3996127 100644
--- a/src/java/org/apache/cassandra/triggers/TriggerExecutor.java
+++ b/src/java/org/apache/cassandra/triggers/TriggerExecutor.java
@@ -85,7 +85,12 @@ public class TriggerExecutor
         if (intermediate == null || intermediate.isEmpty())
             return updates;
 
-        return PartitionUpdate.merge(validateForSinglePartition(updates.metadata().cfId, updates.partitionKey(), intermediate));
+        List<PartitionUpdate> augmented = validateForSinglePartition(updates.metadata().cfId,
+                                                                     updates.partitionKey(),
+                                                                     intermediate);
+        // concatenate augmented and origin
+        augmented.add(updates);
+        return PartitionUpdate.merge(augmented);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/cassandra/blob/51e6f244/test/unit/org/apache/cassandra/triggers/TriggerExecutorTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/triggers/TriggerExecutorTest.java b/test/unit/org/apache/cassandra/triggers/TriggerExecutorTest.java
index 44391c8..d3c6961 100644
--- a/test/unit/org/apache/cassandra/triggers/TriggerExecutorTest.java
+++ b/test/unit/org/apache/cassandra/triggers/TriggerExecutorTest.java
@@ -44,14 +44,29 @@ public class TriggerExecutorTest
     public void sameKeySameCfColumnFamilies() throws ConfigurationException, InvalidRequestException
     {
         CFMetaData metadata = makeCfMetaData("ks1", "cf1", TriggerMetadata.create("test", SameKeySameCfTrigger.class.getName()));
+        // origin column 'c1' = "v1", augment extra column 'c2' = "trigger"
         PartitionUpdate mutated = TriggerExecutor.instance.execute(makeCf(metadata, "k1", "v1", null));
 
-        RowIterator rowIterator = UnfilteredRowIterators.filter(mutated.unfilteredIterator(), FBUtilities.nowInSeconds());
+        List<Row> rows = new ArrayList<>();
+        try (RowIterator iterator = UnfilteredRowIterators.filter(mutated.unfilteredIterator(),
+                                                                  FBUtilities.nowInSeconds()))
+        {
+            iterator.forEachRemaining(rows::add);
+        }
+
+        // only 1 row
+        assertEquals(1, rows.size());
+
+        List<Cell> cells = new ArrayList<>();
+        rows.get(0).cells().forEach(cells::add);
 
-        Iterator<Cell> cells = rowIterator.next().cells().iterator();
-        assertEquals(bytes("trigger"), cells.next().value());
+        // 2 columns
+        assertEquals(2, cells.size());
 
-        assertTrue(!rowIterator.hasNext());
+        // check column 'c1'
+        assertEquals(bytes("v1"), cells.get(0).value());
+        // check column 'c2'
+        assertEquals(bytes("trigger"), cells.get(1).value());
     }
 
     @Test(expected = InvalidRequestException.class)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/51e6f244/test/unit/org/apache/cassandra/triggers/TriggersTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/triggers/TriggersTest.java b/test/unit/org/apache/cassandra/triggers/TriggersTest.java
index 13ecbe9..67619dc 100644
--- a/test/unit/org/apache/cassandra/triggers/TriggersTest.java
+++ b/test/unit/org/apache/cassandra/triggers/TriggersTest.java
@@ -108,7 +108,7 @@ public class TriggersTest
     {
         String cql = String.format("INSERT INTO %s.%s (k, v1) VALUES (0, 0)", ksName, cfName);
         QueryProcessor.process(cql, ConsistencyLevel.ONE);
-        assertUpdateIsAugmented(0);
+        assertUpdateIsAugmented(0, "v1", 0);
     }
 
     @Test
@@ -119,7 +119,7 @@ public class TriggersTest
                                    "APPLY BATCH",
                                    ksName, cfName);
         QueryProcessor.process(cql, ConsistencyLevel.ONE);
-        assertUpdateIsAugmented(1);
+        assertUpdateIsAugmented(1, "v1", 1);
     }
 
     @Test
@@ -135,7 +135,7 @@ public class TriggersTest
                       getColumnForInsert("v1", 2),
                       org.apache.cassandra.thrift.ConsistencyLevel.ONE);
 
-        assertUpdateIsAugmented(2);
+        assertUpdateIsAugmented(2, "v1", 2);
     }
 
     @Test
@@ -156,7 +156,7 @@ public class TriggersTest
                                                               Collections.singletonList(mutation))),
             org.apache.cassandra.thrift.ConsistencyLevel.ONE);
 
-        assertUpdateIsAugmented(3);
+        assertUpdateIsAugmented(3, "v1", 3);
     }
 
     @Test
@@ -164,7 +164,7 @@ public class TriggersTest
     {
         String cql = String.format("INSERT INTO %s.%s (k, v1) VALUES (4, 4) IF NOT EXISTS", ksName, cfName);
         QueryProcessor.process(cql, ConsistencyLevel.ONE);
-        assertUpdateIsAugmented(4);
+        assertUpdateIsAugmented(4, "v1", 4);
     }
 
     @Test
@@ -176,7 +176,7 @@ public class TriggersTest
                                    "APPLY BATCH",
                                     ksName, cfName);
         QueryProcessor.process(cql, ConsistencyLevel.ONE);
-        assertUpdateIsAugmented(5);
+        assertUpdateIsAugmented(5, "v1", 5);
     }
 
     @Test
@@ -194,7 +194,7 @@ public class TriggersTest
                    org.apache.cassandra.thrift.ConsistencyLevel.LOCAL_SERIAL,
                    org.apache.cassandra.thrift.ConsistencyLevel.ONE);
 
-        assertUpdateIsAugmented(6);
+        assertUpdateIsAugmented(6, "v1", 6);
     }
 
     // Unfortunately, an IRE thrown from StorageProxy.cas
@@ -295,12 +295,18 @@ public class TriggersTest
         QueryProcessor.process(cql, ConsistencyLevel.ONE);
     }
 
-    private void assertUpdateIsAugmented(int key)
+    private void assertUpdateIsAugmented(int key, String originColumnName, Object originColumnValue)
     {
-        UntypedResultSet rs = QueryProcessor.executeInternal(
-                String.format("SELECT * FROM %s.%s WHERE k=%s", ksName, cfName, key));
-        assertTrue(String.format("Expected value (%s) for augmented cell v2 was not found", key), rs.one().has("v2"));
-        assertEquals(999, rs.one().getInt("v2"));
+        UntypedResultSet rs = QueryProcessor.process(String.format("SELECT * FROM %s.%s WHERE k=%s", ksName, cfName, key), ConsistencyLevel.ONE);
+        assertRowValue(rs.one(), key, "v2", 999); // from trigger
+        assertRowValue(rs.one(), key, originColumnName, originColumnValue); // from original update
+    }
+    
+    private void assertRowValue(UntypedResultSet.Row row, int key, String columnName, Object columnValue)
+    {
+        assertTrue(String.format("Expected value (%s) for augmented cell %s was not found", key, columnName),
+                   row.has(columnName));
+        assertEquals(columnValue, row.getInt(columnName));
     }
 
     private void assertUpdateNotExecuted(String cf, int key)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org