This is an automated email from the ASF dual-hosted git repository. bereng pushed a commit to branch cassandra-4.0 in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/cassandra-4.0 by this push: new 8ba8f0b ViewComplexTest hardening 8ba8f0b is described below commit 8ba8f0b841ba772dcdaf8b5109b7d3fda87b6888 Author: Bereng <berenguerbl...@gmail.com> AuthorDate: Fri Oct 29 08:26:34 2021 +0200 ViewComplexTest hardening patch by Andres de la Peña, Berenguer Blasi; reviewed by Andres de la Peña for CASSANDRA-17070 Co-authored-by: Andres de la Peña <a.penya.gar...@gmail.com> Co-authored-by: Berenguer Blasi <berenguerbl...@gmail.com> --- .../cassandra/cql3/ViewComplexDeletionsTest.java | 290 ++++++++------------- .../cassandra/cql3/ViewComplexLivenessTest.java | 126 +++------ .../apache/cassandra/cql3/ViewComplexTTLTest.java | 138 ++++------ .../org/apache/cassandra/cql3/ViewComplexTest.java | 196 ++++---------- .../apache/cassandra/cql3/ViewComplexTester.java | 130 +++++++++ .../cassandra/cql3/ViewComplexUpdatesTest.java | 204 ++++++--------- 6 files changed, 452 insertions(+), 632 deletions(-) diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsTest.java index 51852ce..33fa6d9 100644 --- a/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsTest.java +++ b/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsTest.java @@ -18,32 +18,23 @@ package org.apache.cassandra.cql3; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; +import java.util.Comparator; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.compaction.CompactionManager; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.schema.SchemaConstants; -import org.apache.cassandra.transport.ProtocolVersion; import org.apache.cassandra.utils.FBUtilities; -import static org.apache.cassandra.cql3.ViewComplexTest.createView; -import static org.apache.cassandra.cql3.ViewComplexTest.updateView; -import static org.apache.cassandra.cql3.ViewComplexTest.updateViewWithFlush; import static org.junit.Assert.assertEquals; /* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670) @@ -54,38 +45,8 @@ import static org.junit.Assert.assertEquals; * - ViewComplexTest * - ViewComplexLivenessTest */ -@RunWith(Parameterized.class) -public class ViewComplexDeletionsTest extends CQLTester +public class ViewComplexDeletionsTest extends ViewComplexTester { - @Parameterized.Parameter - public ProtocolVersion version; - - @Parameterized.Parameters() - public static Collection<Object[]> versions() - { - return ViewComplexTest.versions(); - } - - private final List<String> views = new ArrayList<>(); - - @BeforeClass - public static void startup() - { - ViewComplexTest.startup(); - } - - @Before - public void begin() - { - ViewComplexTest.beginSetup(views); - } - - @After - public void end() throws Throwable - { - ViewComplexTest.endTearDown(views, version, this); - } - // for now, unselected column cannot be fully supported, SEE CASSANDRA-11500 @Ignore @Test @@ -95,44 +56,41 @@ public class ViewComplexDeletionsTest extends CQLTester execute("USE " + keyspace()); executeNet(version, "USE " + keyspace()); createTable("CREATE TABLE %s (k int, c int, a int, b int, PRIMARY KEY (k, c))"); - createView("mv", - "CREATE MATERIALIZED VIEW %s AS SELECT k,c FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)", - version, - this, - views); + String mv = createView("CREATE MATERIALIZED VIEW %s " + + "AS SELECT k,c FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)"); Keyspace ks = Keyspace.open(keyspace()); - ks.getColumnFamilyStore("mv").disableAutoCompaction(); + ks.getColumnFamilyStore(mv).disableAutoCompaction(); - updateView("UPDATE %s USING TIMESTAMP 10 SET b=1 WHERE k=1 AND c=1", version, this); + updateView("UPDATE %s USING TIMESTAMP 10 SET b=1 WHERE k=1 AND c=1"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRows(execute("SELECT * from %s"), row(1, 1, null, 1)); - assertRows(execute("SELECT * from mv"), row(1, 1)); - updateView("DELETE b FROM %s USING TIMESTAMP 11 WHERE k=1 AND c=1", version, this); + assertRows(execute("SELECT * from " + mv), row(1, 1)); + updateView("DELETE b FROM %s USING TIMESTAMP 11 WHERE k=1 AND c=1"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertEmpty(execute("SELECT * from %s")); - assertEmpty(execute("SELECT * from mv")); - updateView("UPDATE %s USING TIMESTAMP 1 SET a=1 WHERE k=1 AND c=1", version, this); + assertEmpty(execute("SELECT * from " + mv)); + updateView("UPDATE %s USING TIMESTAMP 1 SET a=1 WHERE k=1 AND c=1"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRows(execute("SELECT * from %s"), row(1, 1, 1, null)); - assertRows(execute("SELECT * from mv"), row(1, 1)); + assertRows(execute("SELECT * from " + mv), row(1, 1)); execute("truncate %s;"); // removal generated by unselected column should not shadow PK update with smaller timestamp - updateViewWithFlush("UPDATE %s USING TIMESTAMP 18 SET a=1 WHERE k=1 AND c=1", flush, version, this); + updateViewWithFlush("UPDATE %s USING TIMESTAMP 18 SET a=1 WHERE k=1 AND c=1", flush); assertRows(execute("SELECT * from %s"), row(1, 1, 1, null)); - assertRows(execute("SELECT * from mv"), row(1, 1)); + assertRows(execute("SELECT * from " + mv), row(1, 1)); - updateViewWithFlush("UPDATE %s USING TIMESTAMP 20 SET a=null WHERE k=1 AND c=1", flush, version, this); + updateViewWithFlush("UPDATE %s USING TIMESTAMP 20 SET a=null WHERE k=1 AND c=1", flush); assertRows(execute("SELECT * from %s")); - assertRows(execute("SELECT * from mv")); + assertRows(execute("SELECT * from " + mv)); - updateViewWithFlush("INSERT INTO %s(k,c) VALUES(1,1) USING TIMESTAMP 15", flush, version, this); + updateViewWithFlush("INSERT INTO %s(k,c) VALUES(1,1) USING TIMESTAMP 15", flush); assertRows(execute("SELECT * from %s"), row(1, 1, null, null)); - assertRows(execute("SELECT * from mv"), row(1, 1)); + assertRows(execute("SELECT * from " + mv), row(1, 1)); } @Test @@ -152,78 +110,75 @@ public class ViewComplexDeletionsTest extends CQLTester execute("USE " + keyspace()); executeNet(version, "USE " + keyspace()); createTable("CREATE TABLE %s (k int, c int, a int, b int, e int, f int, PRIMARY KEY (k, c))"); - createView("mv", - "CREATE MATERIALIZED VIEW %s AS SELECT a, b, c, k FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)", - version, - this, - views); + String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT a, b, c, k FROM %%s " + + "WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)"); Keyspace ks = Keyspace.open(keyspace()); - ks.getColumnFamilyStore("mv").disableAutoCompaction(); + ks.getColumnFamilyStore(mv).disableAutoCompaction(); - updateViewWithFlush("UPDATE %s USING TIMESTAMP 10 SET b=1 WHERE k=1 AND c=1", flush, version, this); + updateViewWithFlush("UPDATE %s USING TIMESTAMP 10 SET b=1 WHERE k=1 AND c=1", flush); assertRows(execute("SELECT * from %s"), row(1, 1, null, 1, null, null)); - assertRows(execute("SELECT * from mv"), row(1, 1, null, 1)); + assertRows(execute("SELECT * from " + mv), row(1, 1, null, 1)); - updateViewWithFlush("DELETE b FROM %s USING TIMESTAMP 11 WHERE k=1 AND c=1", flush, version, this); + updateViewWithFlush("DELETE b FROM %s USING TIMESTAMP 11 WHERE k=1 AND c=1", flush); assertEmpty(execute("SELECT * from %s")); - assertEmpty(execute("SELECT * from mv")); + assertEmpty(execute("SELECT * from " + mv)); - updateViewWithFlush("UPDATE %s USING TIMESTAMP 1 SET a=1 WHERE k=1 AND c=1", flush, version, this); + updateViewWithFlush("UPDATE %s USING TIMESTAMP 1 SET a=1 WHERE k=1 AND c=1", flush); assertRows(execute("SELECT * from %s"), row(1, 1, 1, null, null, null)); - assertRows(execute("SELECT * from mv"), row(1, 1, 1, null)); + assertRows(execute("SELECT * from " + mv), row(1, 1, 1, null)); - updateViewWithFlush("DELETE a FROM %s USING TIMESTAMP 1 WHERE k=1 AND c=1", flush, version, this); + updateViewWithFlush("DELETE a FROM %s USING TIMESTAMP 1 WHERE k=1 AND c=1", flush); assertEmpty(execute("SELECT * from %s")); - assertEmpty(execute("SELECT * from mv")); + assertEmpty(execute("SELECT * from " + mv)); // view livenessInfo should not be affected by selected column ts or tb - updateViewWithFlush("INSERT INTO %s(k,c) VALUES(1,1) USING TIMESTAMP 0", flush, version, this); + updateViewWithFlush("INSERT INTO %s(k,c) VALUES(1,1) USING TIMESTAMP 0", flush); assertRows(execute("SELECT * from %s"), row(1, 1, null, null, null, null)); - assertRows(execute("SELECT * from mv"), row(1, 1, null, null)); + assertRows(execute("SELECT * from " + mv), row(1, 1, null, null)); - updateViewWithFlush("UPDATE %s USING TIMESTAMP 12 SET b=1 WHERE k=1 AND c=1", flush, version, this); + updateViewWithFlush("UPDATE %s USING TIMESTAMP 12 SET b=1 WHERE k=1 AND c=1", flush); assertRows(execute("SELECT * from %s"), row(1, 1, null, 1, null, null)); - assertRows(execute("SELECT * from mv"), row(1, 1, null, 1)); + assertRows(execute("SELECT * from " + mv), row(1, 1, null, 1)); - updateViewWithFlush("DELETE b FROM %s USING TIMESTAMP 13 WHERE k=1 AND c=1", flush, version, this); + updateViewWithFlush("DELETE b FROM %s USING TIMESTAMP 13 WHERE k=1 AND c=1", flush); assertRows(execute("SELECT * from %s"), row(1, 1, null, null, null, null)); - assertRows(execute("SELECT * from mv"), row(1, 1, null, null)); + assertRows(execute("SELECT * from " + mv), row(1, 1, null, null)); - updateViewWithFlush("DELETE FROM %s USING TIMESTAMP 14 WHERE k=1 AND c=1", flush, version, this); + updateViewWithFlush("DELETE FROM %s USING TIMESTAMP 14 WHERE k=1 AND c=1", flush); assertEmpty(execute("SELECT * from %s")); - assertEmpty(execute("SELECT * from mv")); + assertEmpty(execute("SELECT * from " + mv)); - updateViewWithFlush("INSERT INTO %s(k,c) VALUES(1,1) USING TIMESTAMP 15", flush, version, this); + updateViewWithFlush("INSERT INTO %s(k,c) VALUES(1,1) USING TIMESTAMP 15", flush); assertRows(execute("SELECT * from %s"), row(1, 1, null, null, null, null)); - assertRows(execute("SELECT * from mv"), row(1, 1, null, null)); + assertRows(execute("SELECT * from " + mv), row(1, 1, null, null)); - updateViewWithFlush("UPDATE %s USING TTL 3 SET b=1 WHERE k=1 AND c=1", flush, version, this); + updateViewWithFlush("UPDATE %s USING TTL 3 SET b=1 WHERE k=1 AND c=1", flush); assertRows(execute("SELECT * from %s"), row(1, 1, null, 1, null, null)); - assertRows(execute("SELECT * from mv"), row(1, 1, null, 1)); + assertRows(execute("SELECT * from " + mv), row(1, 1, null, 1)); TimeUnit.SECONDS.sleep(4); assertRows(execute("SELECT * from %s"), row(1, 1, null, null, null, null)); - assertRows(execute("SELECT * from mv"), row(1, 1, null, null)); + assertRows(execute("SELECT * from " + mv), row(1, 1, null, null)); - updateViewWithFlush("DELETE FROM %s USING TIMESTAMP 15 WHERE k=1 AND c=1", flush, version, this); + updateViewWithFlush("DELETE FROM %s USING TIMESTAMP 15 WHERE k=1 AND c=1", flush); assertEmpty(execute("SELECT * from %s")); - assertEmpty(execute("SELECT * from mv")); + assertEmpty(execute("SELECT * from " + mv)); execute("truncate %s;"); // removal generated by unselected column should not shadow selected column with smaller timestamp - updateViewWithFlush("UPDATE %s USING TIMESTAMP 18 SET e=1 WHERE k=1 AND c=1", flush, version, this); + updateViewWithFlush("UPDATE %s USING TIMESTAMP 18 SET e=1 WHERE k=1 AND c=1", flush); assertRows(execute("SELECT * from %s"), row(1, 1, null, null, 1, null)); - assertRows(execute("SELECT * from mv"), row(1, 1, null, null)); + assertRows(execute("SELECT * from " + mv), row(1, 1, null, null)); - updateViewWithFlush("UPDATE %s USING TIMESTAMP 18 SET e=null WHERE k=1 AND c=1", flush, version, this); + updateViewWithFlush("UPDATE %s USING TIMESTAMP 18 SET e=null WHERE k=1 AND c=1", flush); assertRows(execute("SELECT * from %s")); - assertRows(execute("SELECT * from mv")); + assertRows(execute("SELECT * from " + mv)); - updateViewWithFlush("UPDATE %s USING TIMESTAMP 16 SET a=1 WHERE k=1 AND c=1", flush, version, this); + updateViewWithFlush("UPDATE %s USING TIMESTAMP 16 SET a=1 WHERE k=1 AND c=1", flush); assertRows(execute("SELECT * from %s"), row(1, 1, 1, null, null, null)); - assertRows(execute("SELECT * from mv"), row(1, 1, 1, null)); + assertRows(execute("SELECT * from " + mv), row(1, 1, 1, null)); } @Test @@ -238,7 +193,7 @@ public class ViewComplexDeletionsTest extends CQLTester testRangeDeletion(false); } - public void testRangeDeletion(boolean flush) throws Throwable + private void testRangeDeletion(boolean flush) throws Throwable { // for partition range deletion, need to know that existing row is shadowed instead of not existed. createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a))"); @@ -246,40 +201,37 @@ public class ViewComplexDeletionsTest extends CQLTester execute("USE " + keyspace()); executeNet(version, "USE " + keyspace()); - createView("mv_test1", - "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a, b)", - version, - this, - views); + String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " + + "WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a, b)"); Keyspace ks = Keyspace.open(keyspace()); - ks.getColumnFamilyStore("mv_test1").disableAutoCompaction(); + ks.getColumnFamilyStore(mv).disableAutoCompaction(); execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?) using timestamp 0", 1, 1, 1, 1); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT * FROM mv_test1"), row(1, 1, 1, 1)); + assertRowsIgnoringOrder(execute("SELECT * FROM " + mv), row(1, 1, 1, 1)); // remove view row - updateView("UPDATE %s using timestamp 1 set b = null WHERE a=1", version, this); + updateView("UPDATE %s using timestamp 1 set b = null WHERE a=1"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT * FROM mv_test1")); + assertRowsIgnoringOrder(execute("SELECT * FROM " + mv)); // remove base row, no view updated generated. - updateView("DELETE FROM %s using timestamp 2 where a=1", version, this); + updateView("DELETE FROM %s using timestamp 2 where a=1"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT * FROM mv_test1")); + assertRowsIgnoringOrder(execute("SELECT * FROM " + mv)); // restor view row with b,c column. d is still tombstone - updateView("UPDATE %s using timestamp 3 set b = 1,c = 1 where a=1", version, this); // upsert + updateView("UPDATE %s using timestamp 3 set b = 1,c = 1 where a=1"); // upsert if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT * FROM mv_test1"), row(1, 1, 1, null)); + assertRowsIgnoringOrder(execute("SELECT * FROM " + mv), row(1, 1, 1, null)); } @Test @@ -305,64 +257,61 @@ public class ViewComplexDeletionsTest extends CQLTester executeNet(version, "USE " + keyspace()); Keyspace ks = Keyspace.open(keyspace()); - createView("mv", - "create materialized view %s as select * from %%s where p is not null and v1 is not null primary key (v1, p);", - version, - this, - views); - ks.getColumnFamilyStore("mv").disableAutoCompaction(); + String mv = createView("create materialized view %s as select * from %%s " + + "where p is not null and v1 is not null primary key (v1, p)"); + ks.getColumnFamilyStore(mv).disableAutoCompaction(); // sstable-1, Set initial values TS=1 - updateView("Insert into %s (p, v1, v2) values (3, 1, 3) using timestamp 1;", version, this); + updateView("Insert into %s (p, v1, v2) values (3, 1, 3) using timestamp 1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v2, WRITETIME(v2) from mv WHERE v1 = ? AND p = ?", 1, 3), row(3, 1L)); + assertRowsIgnoringOrder(execute("SELECT v2, WRITETIME(v2) from " + mv + " WHERE v1 = ? AND p = ?", 1, 3), row(3, 1L)); // sstable-2 - updateView("Delete from %s using timestamp 2 where p = 3;", version, this); + updateView("Delete from %s using timestamp 2 where p = 3;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from mv")); + assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv)); // sstable-3 - updateView("Insert into %s (p, v1) values (3, 1) using timestamp 3;", version, this); + updateView("Insert into %s (p, v1) values (3, 1) using timestamp 3;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from mv"), row(1, 3, null, null)); + assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, null, null)); // sstable-4 - updateView("UPdate %s using timestamp 4 set v1 = 2 where p = 3;", version, this); + updateView("UPdate %s using timestamp 4 set v1 = 2 where p = 3;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from mv"), row(2, 3, null, null)); + assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(2, 3, null, null)); // sstable-5 - updateView("UPdate %s using timestamp 5 set v1 = 1 where p = 3;", version, this); + updateView("UPdate %s using timestamp 5 set v1 = 1 where p = 3;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from mv"), row(1, 3, null, null)); + assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, null, null)); if (flush) { // compact sstable 2 and 4, 5; - ColumnFamilyStore cfs = ks.getColumnFamilyStore("mv"); + ColumnFamilyStore cfs = ks.getColumnFamilyStore(mv); List<String> sstables = cfs.getLiveSSTables() .stream() - .sorted((s1, s2) -> s1.descriptor.generation - s2.descriptor.generation) - .map(s -> s.getFilename()) + .sorted(Comparator.comparingInt(s -> s.descriptor.generation)) + .map(SSTableReader::getFilename) .collect(Collectors.toList()); String dataFiles = String.join(",", Arrays.asList(sstables.get(1), sstables.get(3), sstables.get(4))); CompactionManager.instance.forceUserDefinedCompaction(dataFiles); assertEquals(3, cfs.getLiveSSTables().size()); } // regular tombstone should be retained after compaction - assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from mv"), row(1, 3, null, null)); + assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, null, null)); } @Test @@ -387,63 +336,60 @@ public class ViewComplexDeletionsTest extends CQLTester executeNet(version, "USE " + keyspace()); Keyspace ks = Keyspace.open(keyspace()); - createView("mv2", - "create materialized view %s as select * from %%s where p1 is not null and p2 is not null primary key (p2, p1);", - version, - this, - views); - ks.getColumnFamilyStore("mv2").disableAutoCompaction(); + String mv = createView("create materialized view %s as select * from %%s " + + "where p1 is not null and p2 is not null primary key (p2, p1)"); + ks.getColumnFamilyStore(mv).disableAutoCompaction(); // Set initial values TS=1 - updateView("Insert into %s (p1, p2, v1, v2) values (1, 2, 3, 4) using timestamp 1;", version, this); + updateView("Insert into %s (p1, p2, v1, v2) values (1, 2, 3, 4) using timestamp 1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v1, v2, WRITETIME(v2) from mv2 WHERE p1 = ? AND p2 = ?", 1, 2), + assertRowsIgnoringOrder(execute("SELECT v1, v2, WRITETIME(v2) from " + mv + " WHERE p1 = ? AND p2 = ?", 1, 2), row(3, 4, 1L)); // remove row/mv TS=2 - updateView("Delete from %s using timestamp 2 where p1 = 1 and p2 = 2;", version, this); + updateView("Delete from %s using timestamp 2 where p1 = 1 and p2 = 2;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); // view are empty - assertRowsIgnoringOrder(execute("SELECT * from mv2")); + assertRowsIgnoringOrder(execute("SELECT * from " + mv)); // insert PK with TS=3 - updateView("Insert into %s (p1, p2) values (1, 2) using timestamp 3;", version, this); + updateView("Insert into %s (p1, p2) values (1, 2) using timestamp 3;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); // deleted column in MV remained dead - assertRowsIgnoringOrder(execute("SELECT * from mv2"), row(2, 1, null, null)); + assertRowsIgnoringOrder(execute("SELECT * from " + mv), row(2, 1, null, null)); - ks.getColumnFamilyStore("mv2").forceMajorCompaction(); - assertRowsIgnoringOrder(execute("SELECT * from mv2"), row(2, 1, null, null)); + ks.getColumnFamilyStore(mv).forceMajorCompaction(); + assertRowsIgnoringOrder(execute("SELECT * from " + mv), row(2, 1, null, null)); // reset values - updateView("Insert into %s (p1, p2, v1, v2) values (1, 2, 3, 4) using timestamp 10;", version, this); + updateView("Insert into %s (p1, p2, v1, v2) values (1, 2, 3, 4) using timestamp 10;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v1, v2, WRITETIME(v2) from mv2 WHERE p1 = ? AND p2 = ?", 1, 2), + assertRowsIgnoringOrder(execute("SELECT v1, v2, WRITETIME(v2) from " + mv + " WHERE p1 = ? AND p2 = ?", 1, 2), row(3, 4, 10L)); - updateView("UPDATE %s using timestamp 20 SET v2 = 5 WHERE p1 = 1 and p2 = 2", version, this); + updateView("UPDATE %s using timestamp 20 SET v2 = 5 WHERE p1 = 1 and p2 = 2"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v1, v2, WRITETIME(v2) from mv2 WHERE p1 = ? AND p2 = ?", 1, 2), + assertRowsIgnoringOrder(execute("SELECT v1, v2, WRITETIME(v2) from " + mv + " WHERE p1 = ? AND p2 = ?", 1, 2), row(3, 5, 20L)); - updateView("DELETE FROM %s using timestamp 10 WHERE p1 = 1 and p2 = 2", version, this); + updateView("DELETE FROM %s using timestamp 10 WHERE p1 = 1 and p2 = 2"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v1, v2, WRITETIME(v2) from mv2 WHERE p1 = ? AND p2 = ?", 1, 2), + assertRowsIgnoringOrder(execute("SELECT v1, v2, WRITETIME(v2) from " + mv + " WHERE p1 = ? AND p2 = ?", 1, 2), row(null, 5, 20L)); } - public void complexTimestampWithbaseNonPKColumnsInViewPKDeletionTest(boolean flush) throws Throwable + private void complexTimestampWithbaseNonPKColumnsInViewPKDeletionTest(boolean flush) throws Throwable { createTable("create table %s (p int primary key, v1 int, v2 int)"); @@ -451,43 +397,40 @@ public class ViewComplexDeletionsTest extends CQLTester executeNet(version, "USE " + keyspace()); Keyspace ks = Keyspace.open(keyspace()); - createView("mv", - "create materialized view %s as select * from %%s where p is not null and v1 is not null primary key (v1, p);", - version, - this, - views); - ks.getColumnFamilyStore("mv").disableAutoCompaction(); + String mv = createView("create materialized view %s as select * from %%s " + + "where p is not null and v1 is not null primary key (v1, p)"); + ks.getColumnFamilyStore(mv).disableAutoCompaction(); // Set initial values TS=1 - updateView("Insert into %s (p, v1, v2) values (3, 1, 5) using timestamp 1;", version, this); + updateView("Insert into %s (p, v1, v2) values (3, 1, 5) using timestamp 1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v2, WRITETIME(v2) from mv WHERE v1 = ? AND p = ?", 1, 3), row(5, 1L)); + assertRowsIgnoringOrder(execute("SELECT v2, WRITETIME(v2) from " + mv + " WHERE v1 = ? AND p = ?", 1, 3), row(5, 1L)); // remove row/mv TS=2 - updateView("Delete from %s using timestamp 2 where p = 3;", version, this); + updateView("Delete from %s using timestamp 2 where p = 3;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); // view are empty - assertRowsIgnoringOrder(execute("SELECT * from mv")); + assertRowsIgnoringOrder(execute("SELECT * from " + mv)); // insert PK with TS=3 - updateView("Insert into %s (p, v1) values (3, 1) using timestamp 3;", version, this); + updateView("Insert into %s (p, v1) values (3, 1) using timestamp 3;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); // deleted column in MV remained dead - assertRowsIgnoringOrder(execute("SELECT * from mv"), row(1, 3, null)); + assertRowsIgnoringOrder(execute("SELECT * from " + mv), row(1, 3, null)); // insert values TS=2, it should be considered dead due to previous tombstone - updateView("Insert into %s (p, v1, v2) values (3, 1, 5) using timestamp 2;", version, this); + updateView("Insert into %s (p, v1, v2) values (3, 1, 5) using timestamp 2;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); // deleted column in MV remained dead - assertRowsIgnoringOrder(execute("SELECT * from mv"), row(1, 3, null)); - assertRowsIgnoringOrder(execute("SELECT * from mv limit 1"), row(1, 3, null)); + assertRowsIgnoringOrder(execute("SELECT * from " + mv), row(1, 3, null)); + assertRowsIgnoringOrder(execute("SELECT * from " + mv + " limit 1"), row(1, 3, null)); // insert values TS=2, it should be considered dead due to previous tombstone executeNet(version, "UPDATE %s USING TIMESTAMP 3 SET v2 = ? WHERE p = ?", 4, 3); @@ -495,11 +438,11 @@ public class ViewComplexDeletionsTest extends CQLTester if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRows(execute("SELECT v1, p, v2, WRITETIME(v2) from mv"), row(1, 3, 4, 3L)); + assertRows(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, 4, 3L)); - ks.getColumnFamilyStore("mv").forceMajorCompaction(); - assertRows(execute("SELECT v1, p, v2, WRITETIME(v2) from mv"), row(1, 3, 4, 3L)); - assertRows(execute("SELECT v1, p, v2, WRITETIME(v2) from mv limit 1"), row(1, 3, 4, 3L)); + ks.getColumnFamilyStore(mv).forceMajorCompaction(); + assertRows(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, 4, 3L)); + assertRows(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv + " limit 1"), row(1, 3, 4, 3L)); } @Test @@ -509,18 +452,15 @@ public class ViewComplexDeletionsTest extends CQLTester executeNet(version, "USE " + keyspace()); createTable("CREATE TABLE %s (k1 int primary key, v1 int)"); - createView("view1", - "CREATE MATERIALIZED VIEW view1 AS SELECT * FROM %%s WHERE k1 IS NOT NULL AND v1 IS NOT NULL PRIMARY KEY (v1, k1)", - version, - this, - views); + createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " + + "WHERE k1 IS NOT NULL AND v1 IS NOT NULL PRIMARY KEY (v1, k1)"); ColumnFamilyStore batchlog = Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.BATCHES); batchlog.disableAutoCompaction(); batchlog.forceBlockingFlush(); int batchlogSSTables = batchlog.getLiveSSTables().size(); - updateView("INSERT INTO %s(k1, v1) VALUES(1, 1)", version, this); + updateView("INSERT INTO %s(k1, v1) VALUES(1, 1)"); batchlog.forceBlockingFlush(); assertEquals(batchlogSSTables, batchlog.getLiveSSTables().size()); } diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessTest.java index 6999bef..7b4aa1a 100644 --- a/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessTest.java +++ b/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessTest.java @@ -18,26 +18,14 @@ package org.apache.cassandra.cql3; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; -import org.apache.cassandra.transport.ProtocolVersion; import org.apache.cassandra.utils.FBUtilities; -import static org.apache.cassandra.cql3.ViewComplexTest.createView; -import static org.apache.cassandra.cql3.ViewComplexTest.updateView; -import static org.apache.cassandra.cql3.ViewComplexTest.updateViewWithFlush; import static org.junit.Assert.assertEquals; /* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670) @@ -48,38 +36,8 @@ import static org.junit.Assert.assertEquals; * - ViewComplexTest * - ViewComplexLivenessTest */ -@RunWith(Parameterized.class) -public class ViewComplexLivenessTest extends CQLTester +public class ViewComplexLivenessTest extends ViewComplexTester { - @Parameterized.Parameter - public ProtocolVersion version; - - @Parameterized.Parameters() - public static Collection<Object[]> versions() - { - return ViewComplexTest.versions(); - } - - private final List<String> views = new ArrayList<>(); - - @BeforeClass - public static void startup() - { - ViewComplexTest.startup(); - } - - @Before - public void begin() - { - ViewComplexTest.beginSetup(views); - } - - @After - public void end() throws Throwable - { - ViewComplexTest.endTearDown(views, version, this); - } - @Test public void testUnselectedColumnWithExpiredLivenessInfo() throws Throwable { @@ -90,48 +48,45 @@ public class ViewComplexLivenessTest extends CQLTester executeNet(version, "USE " + keyspace()); Keyspace ks = Keyspace.open(keyspace()); - createView("mv", - "create materialized view %s as select k,c,b from %%s where c is not null and k is not null primary key (c, k);", - version, - this, - views); - ks.getColumnFamilyStore("mv").disableAutoCompaction(); + String name = createView("create materialized view %s as select k,c,b from %%s " + + "where c is not null and k is not null primary key (c, k)"); + ks.getColumnFamilyStore(name).disableAutoCompaction(); // sstable-1, Set initial values TS=1 - updateViewWithFlush("UPDATE %s SET a = 1 WHERE k = 1 AND c = 1;", flush, version, this); + updateViewWithFlush("UPDATE %s SET a = 1 WHERE k = 1 AND c = 1;", flush); assertRowsIgnoringOrder(execute("SELECT * from %s WHERE k = 1 AND c = 1;"), row(1, 1, 1, null)); - assertRowsIgnoringOrder(execute("SELECT k,c,b from mv WHERE k = 1 AND c = 1;"), + assertRowsIgnoringOrder(execute("SELECT k,c,b from " + name + " WHERE k = 1 AND c = 1;"), row(1, 1, null)); // sstable-2 - updateViewWithFlush("INSERT INTO %s(k,c) VALUES(1,1) USING TTL 5", flush, version, this); + updateViewWithFlush("INSERT INTO %s(k,c) VALUES(1,1) USING TTL 5", flush); assertRowsIgnoringOrder(execute("SELECT * from %s WHERE k = 1 AND c = 1;"), row(1, 1, 1, null)); - assertRowsIgnoringOrder(execute("SELECT k,c,b from mv WHERE k = 1 AND c = 1;"), + assertRowsIgnoringOrder(execute("SELECT k,c,b from " + name + " WHERE k = 1 AND c = 1;"), row(1, 1, null)); Thread.sleep(5001); assertRowsIgnoringOrder(execute("SELECT * from %s WHERE k = 1 AND c = 1;"), row(1, 1, 1, null)); - assertRowsIgnoringOrder(execute("SELECT k,c,b from mv WHERE k = 1 AND c = 1;"), + assertRowsIgnoringOrder(execute("SELECT k,c,b from " + name + " WHERE k = 1 AND c = 1;"), row(1, 1, null)); // sstable-3 - updateViewWithFlush("Update %s set a = null where k = 1 AND c = 1;", flush, version, this); + updateViewWithFlush("Update %s set a = null where k = 1 AND c = 1;", flush); assertRowsIgnoringOrder(execute("SELECT * from %s WHERE k = 1 AND c = 1;")); - assertRowsIgnoringOrder(execute("SELECT k,c,b from mv WHERE k = 1 AND c = 1;")); + assertRowsIgnoringOrder(execute("SELECT k,c,b from " + name + " WHERE k = 1 AND c = 1;")); // sstable-4 - updateViewWithFlush("Update %s USING TIMESTAMP 1 set b = 1 where k = 1 AND c = 1;", flush, version, this); + updateViewWithFlush("Update %s USING TIMESTAMP 1 set b = 1 where k = 1 AND c = 1;", flush); assertRowsIgnoringOrder(execute("SELECT * from %s WHERE k = 1 AND c = 1;"), row(1, 1, null, 1)); - assertRowsIgnoringOrder(execute("SELECT k,c,b from mv WHERE k = 1 AND c = 1;"), + assertRowsIgnoringOrder(execute("SELECT k,c,b from " + name + " WHERE k = 1 AND c = 1;"), row(1, 1, 1)); } @@ -157,35 +112,29 @@ public class ViewComplexLivenessTest extends CQLTester executeNet(version, "USE " + keyspace()); Keyspace ks = Keyspace.open(keyspace()); - createView("mv1", - "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE k IS NOT NULL AND a IS NOT NULL PRIMARY KEY (k, a);", - version, - this, - views); - createView("mv2", - "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE k IS NOT NULL AND a IS NOT NULL PRIMARY KEY (a, k);", - version, - this, - views); - ks.getColumnFamilyStore("mv1").disableAutoCompaction(); - ks.getColumnFamilyStore("mv2").disableAutoCompaction(); + String mv1 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " + + "WHERE k IS NOT NULL AND a IS NOT NULL PRIMARY KEY (k, a)"); + String mv2 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " + + "WHERE k IS NOT NULL AND a IS NOT NULL PRIMARY KEY (a, k)"); + ks.getColumnFamilyStore(mv1).disableAutoCompaction(); + ks.getColumnFamilyStore(mv2).disableAutoCompaction(); for (int i = 1; i <= 100; i++) - updateView("INSERT INTO %s(k, a, b) VALUES (?, ?, ?);", version, this, i, i, i); + updateView("INSERT INTO %s(k, a, b) VALUES (?, ?, ?);", i, i, i); for (int i = 1; i <= 100; i++) { if (i % 50 == 0) continue; // create expired liveness - updateView("DELETE a FROM %s WHERE k = ?;", version, this, i); + updateView("DELETE a FROM %s WHERE k = ?;", i); } if (flush) { - ks.getColumnFamilyStore("mv1").forceBlockingFlush(); - ks.getColumnFamilyStore("mv2").forceBlockingFlush(); + ks.getColumnFamilyStore(mv1).forceBlockingFlush(); + ks.getColumnFamilyStore(mv2).forceBlockingFlush(); } - for (String view : Arrays.asList("mv1", "mv2")) + for (String view : Arrays.asList(mv1, mv2)) { // paging assertEquals(1, executeNetWithPaging(version, String.format("SELECT k,a,b FROM %s limit 1", view), 1).all().size()); @@ -211,21 +160,18 @@ public class ViewComplexLivenessTest extends CQLTester executeNet(version, "USE " + keyspace()); Keyspace ks = Keyspace.open(keyspace()); - createView("mv", - "create materialized view %s as select * from %%s where p is not null and v1 is not null primary key (v1, p)" - + " with gc_grace_seconds=5;", - version, - this, - views); - ColumnFamilyStore cfs = ks.getColumnFamilyStore("mv"); + String name = createView("create materialized view %s as select * from %%s " + + "where p is not null and v1 is not null primary key (v1, p) " + + "with gc_grace_seconds=5"); + ColumnFamilyStore cfs = ks.getColumnFamilyStore(name); cfs.disableAutoCompaction(); - updateView("Insert into %s (p, v1, v2) values (1, 1, 1) ;", version, this); - assertRowsIgnoringOrder(execute("SELECT p, v1, v2 from mv"), row(1, 1, 1)); + updateView("Insert into %s (p, v1, v2) values (1, 1, 1)"); + assertRowsIgnoringOrder(execute("SELECT p, v1, v2 from " + name), row(1, 1, 1)); - updateView("Update %s set v1 = null WHERE p = 1", version, this); + updateView("Update %s set v1 = null WHERE p = 1"); FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT p, v1, v2 from mv")); + assertRowsIgnoringOrder(execute("SELECT p, v1, v2 from " + name)); cfs.forceMajorCompaction(); // before gc grace second, strict-liveness tombstoned dead row remains assertEquals(1, cfs.getLiveSSTables().size()); @@ -236,18 +182,18 @@ public class ViewComplexLivenessTest extends CQLTester cfs.forceMajorCompaction(); // after gc grace second, no data left assertEquals(0, cfs.getLiveSSTables().size()); - updateView("Update %s using ttl 5 set v1 = 1 WHERE p = 1", version, this); + updateView("Update %s using ttl 5 set v1 = 1 WHERE p = 1"); FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT p, v1, v2 from mv"), row(1, 1, 1)); + assertRowsIgnoringOrder(execute("SELECT p, v1, v2 from " + name), row(1, 1, 1)); cfs.forceMajorCompaction(); // before ttl+gc_grace_second, strict-liveness ttled dead row remains assertEquals(1, cfs.getLiveSSTables().size()); - assertRowsIgnoringOrder(execute("SELECT p, v1, v2 from mv"), row(1, 1, 1)); + assertRowsIgnoringOrder(execute("SELECT p, v1, v2 from " + name), row(1, 1, 1)); Thread.sleep(5500); // after expired, before gc_grace_second cfs.forceMajorCompaction();// before ttl+gc_grace_second, strict-liveness ttled dead row remains assertEquals(1, cfs.getLiveSSTables().size()); - assertRowsIgnoringOrder(execute("SELECT p, v1, v2 from mv")); + assertRowsIgnoringOrder(execute("SELECT p, v1, v2 from " + name)); Thread.sleep(5500); // after expired + gc_grace_second assertEquals(1, cfs.getLiveSSTables().size()); // no auto compaction. diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexTTLTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexTTLTest.java index 76a8933..7c49ffa 100644 --- a/test/unit/org/apache/cassandra/cql3/ViewComplexTTLTest.java +++ b/test/unit/org/apache/cassandra/cql3/ViewComplexTTLTest.java @@ -18,24 +18,12 @@ package org.apache.cassandra.cql3; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.apache.cassandra.db.Keyspace; -import org.apache.cassandra.transport.ProtocolVersion; import org.apache.cassandra.utils.FBUtilities; -import static org.apache.cassandra.cql3.ViewComplexTest.createView; -import static org.apache.cassandra.cql3.ViewComplexTest.updateView; -import static org.apache.cassandra.cql3.ViewComplexTest.updateViewWithFlush; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670) @@ -46,38 +34,8 @@ import static org.junit.Assert.assertTrue; * - ViewComplexTest * - ViewComplexLivenessTest */ -@RunWith(Parameterized.class) -public class ViewComplexTTLTest extends CQLTester +public class ViewComplexTTLTest extends ViewComplexTester { - @Parameterized.Parameter - public ProtocolVersion version; - - @Parameterized.Parameters() - public static Collection<Object[]> versions() - { - return ViewComplexTest.versions(); - } - - private final List<String> views = new ArrayList<>(); - - @BeforeClass - public static void startup() - { - ViewComplexTest.startup(); - } - - @Before - public void begin() - { - ViewComplexTest.beginSetup(views); - } - - @After - public void end() throws Throwable - { - ViewComplexTest.endTearDown(views, version, this); - } - @Test public void testUpdateColumnInViewPKWithTTLWithFlush() throws Throwable { @@ -101,75 +59,72 @@ public class ViewComplexTTLTest extends CQLTester executeNet(version, "USE " + keyspace()); Keyspace ks = Keyspace.open(keyspace()); - createView("mv", - "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE k IS NOT NULL AND a IS NOT NULL PRIMARY KEY (a, k)", - version, - this, - views); - ks.getColumnFamilyStore("mv").disableAutoCompaction(); + String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " + + "WHERE k IS NOT NULL AND a IS NOT NULL PRIMARY KEY (a, k)"); + ks.getColumnFamilyStore(mv).disableAutoCompaction(); - updateView("UPDATE %s SET a = 1 WHERE k = 1;", version, this); + updateView("UPDATE %s SET a = 1 WHERE k = 1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRows(execute("SELECT * from %s"), row(1, 1, null)); - assertRows(execute("SELECT * from mv"), row(1, 1, null)); + assertRows(execute("SELECT * from " + mv), row(1, 1, null)); - updateView("DELETE a FROM %s WHERE k = 1", version, this); + updateView("DELETE a FROM %s WHERE k = 1"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRows(execute("SELECT * from %s")); - assertEmpty(execute("SELECT * from mv")); + assertEmpty(execute("SELECT * from " + mv)); - updateView("INSERT INTO %s (k) VALUES (1);", version, this); + updateView("INSERT INTO %s (k) VALUES (1);"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRows(execute("SELECT * from %s"), row(1, null, null)); - assertEmpty(execute("SELECT * from mv")); + assertEmpty(execute("SELECT * from " + mv)); - updateView("UPDATE %s USING TTL 5 SET a = 10 WHERE k = 1;", version, this); + updateView("UPDATE %s USING TTL 5 SET a = 10 WHERE k = 1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRows(execute("SELECT * from %s"), row(1, 10, null)); - assertRows(execute("SELECT * from mv"), row(10, 1, null)); + assertRows(execute("SELECT * from " + mv), row(10, 1, null)); - updateView("UPDATE %s SET b = 100 WHERE k = 1;", version, this); + updateView("UPDATE %s SET b = 100 WHERE k = 1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRows(execute("SELECT * from %s"), row(1, 10, 100)); - assertRows(execute("SELECT * from mv"), row(10, 1, 100)); + assertRows(execute("SELECT * from " + mv), row(10, 1, 100)); Thread.sleep(5000); // 'a' is TTL of 5 and removed. assertRows(execute("SELECT * from %s"), row(1, null, 100)); - assertEmpty(execute("SELECT * from mv")); - assertEmpty(execute("SELECT * from mv WHERE k = ? AND a = ?", 1, 10)); + assertEmpty(execute("SELECT * from " + mv)); + assertEmpty(execute("SELECT * from " + mv + " WHERE k = ? AND a = ?", 1, 10)); - updateView("DELETE b FROM %s WHERE k=1", version, this); + updateView("DELETE b FROM %s WHERE k=1"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRows(execute("SELECT * from %s"), row(1, null, null)); - assertEmpty(execute("SELECT * from mv")); + assertEmpty(execute("SELECT * from " + mv)); - updateView("DELETE FROM %s WHERE k=1;", version, this); + updateView("DELETE FROM %s WHERE k=1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertEmpty(execute("SELECT * from %s")); - assertEmpty(execute("SELECT * from mv")); + assertEmpty(execute("SELECT * from " + mv)); } @Test public void testUnselectedColumnsTTLWithFlush() throws Throwable @@ -194,47 +149,44 @@ public class ViewComplexTTLTest extends CQLTester executeNet(version, "USE " + keyspace()); Keyspace ks = Keyspace.open(keyspace()); - createView("mv", - "CREATE MATERIALIZED VIEW %s AS SELECT p, c FROM %%s WHERE p IS NOT NULL AND c IS NOT NULL PRIMARY KEY (c, p);", - version, - this, - views); - ks.getColumnFamilyStore("mv").disableAutoCompaction(); + String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT p, c FROM %%s " + + "WHERE p IS NOT NULL AND c IS NOT NULL PRIMARY KEY (c, p)"); + ks.getColumnFamilyStore(mv).disableAutoCompaction(); - updateViewWithFlush("INSERT INTO %s (p, c) VALUES (0, 0) USING TTL 3;", flush, version, this); + updateViewWithFlush("INSERT INTO %s (p, c) VALUES (0, 0) USING TTL 3;", flush); - updateViewWithFlush("UPDATE %s USING TTL 1000 SET v = 0 WHERE p = 0 and c = 0;", flush, version, this); + updateViewWithFlush("UPDATE %s USING TTL 1000 SET v = 0 WHERE p = 0 and c = 0;", flush); - assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = ?", 0, 0), row(0, 0)); + assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0)); Thread.sleep(3000); UntypedResultSet.Row row = execute("SELECT v, ttl(v) from %s WHERE c = ? AND p = ?", 0, 0).one(); - assertTrue("row should have value of 0", row.getInt("v") == 0); + assertEquals("row should have value of 0", 0, row.getInt("v")); assertTrue("row should have ttl less than 1000", row.getInt("ttl(v)") < 1000); - assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = ?", 0, 0), row(0, 0)); + assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0)); - updateViewWithFlush("DELETE FROM %s WHERE p = 0 and c = 0;", flush, version, this); - assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = ?", 0, 0)); + updateViewWithFlush("DELETE FROM %s WHERE p = 0 and c = 0;", flush); + assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0)); - updateViewWithFlush("INSERT INTO %s (p, c) VALUES (0, 0) ", flush, version, this); - assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = ?", 0, 0), row(0, 0)); + updateViewWithFlush("INSERT INTO %s (p, c) VALUES (0, 0) ", flush); + assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0)); // already have a live row, no need to apply the unselected cell ttl - updateViewWithFlush("UPDATE %s USING TTL 3 SET v = 0 WHERE p = 0 and c = 0;", flush, version, this); - assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = ?", 0, 0), row(0, 0)); + updateViewWithFlush("UPDATE %s USING TTL 3 SET v = 0 WHERE p = 0 and c = 0;", flush); + assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0)); - updateViewWithFlush("INSERT INTO %s (p, c) VALUES (1, 1) USING TTL 3", flush, version, this); - assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = ?", 1, 1), row(1, 1)); + updateViewWithFlush("INSERT INTO %s (p, c) VALUES (1, 1) USING TTL 3", flush); + assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 1, 1), row(1, 1)); Thread.sleep(4000); - assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = ?", 0, 0), row(0, 0)); - assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = ?", 1, 1)); + assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0)); + assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 1, 1)); // unselected should keep view row alive - updateViewWithFlush("UPDATE %s SET v = 0 WHERE p = 1 and c = 1;", flush, version, this); - assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = ?", 1, 1), row(1, 1)); + updateViewWithFlush("UPDATE %s SET v = 0 WHERE p = 1 and c = 1;", flush); + assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 1, 1), row(1, 1)); } @@ -248,11 +200,11 @@ public class ViewComplexTTLTest extends CQLTester executeNet(version, "USE " + keyspace()); Keyspace ks = Keyspace.open(keyspace()); - updateView("INSERT INTO %s (p, c, v) VALUES (0, 0, 0) using timestamp 1;", version, this); + updateView("INSERT INTO %s (p, c, v) VALUES (0, 0, 0) using timestamp 1;"); FBUtilities.waitOnFutures(ks.flush()); - updateView("INSERT INTO %s (p, c, v) VALUES (0, 0, 0) USING TTL 3 and timestamp 1;", version, this); + updateView("INSERT INTO %s (p, c, v) VALUES (0, 0, 0) USING TTL 3 and timestamp 1;"); FBUtilities.waitOnFutures(ks.flush()); @@ -263,11 +215,11 @@ public class ViewComplexTTLTest extends CQLTester // reversed order execute("truncate %s;"); - updateView("INSERT INTO %s (p, c, v) VALUES (0, 0, 0) USING TTL 3 and timestamp 1;", version, this); + updateView("INSERT INTO %s (p, c, v) VALUES (0, 0, 0) USING TTL 3 and timestamp 1;"); FBUtilities.waitOnFutures(ks.flush()); - updateView("INSERT INTO %s (p, c, v) VALUES (0, 0, 0) USING timestamp 1;", version, this); + updateView("INSERT INTO %s (p, c, v) VALUES (0, 0, 0) USING timestamp 1;"); FBUtilities.waitOnFutures(ks.flush()); diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java index ea05eef..27cbf07 100644 --- a/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java +++ b/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java @@ -21,7 +21,6 @@ package org.apache.cassandra.cql3; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; @@ -30,21 +29,12 @@ import java.util.Map; import java.util.stream.Collectors; import com.google.common.base.Objects; - -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import com.datastax.driver.core.exceptions.OperationTimedOutException; -import org.apache.cassandra.concurrent.SEPExecutor; -import org.apache.cassandra.concurrent.Stage; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.compaction.CompactionManager; -import org.apache.cassandra.transport.ProtocolVersion; +import org.apache.cassandra.io.sstable.format.SSTableReader; import org.apache.cassandra.utils.FBUtilities; import static org.junit.Assert.fail; @@ -57,85 +47,8 @@ import static org.junit.Assert.fail; * - ViewComplexTest * - ViewComplexLivenessTest */ -@RunWith(Parameterized.class) -public class ViewComplexTest extends CQLTester +public class ViewComplexTest extends ViewComplexTester { - @Parameterized.Parameter - public ProtocolVersion version; - - @Parameterized.Parameters() - public static Collection<Object[]> versions() - { - return ProtocolVersion.SUPPORTED.stream() - .map(v -> new Object[]{v}) - .collect(Collectors.toList()); - } - - private final List<String> views = new ArrayList<>(); - - @BeforeClass - public static void startup() - { - requireNetwork(); - } - - @Before - public void begin() - { - beginSetup(views); - } - - public static void beginSetup(List<String> views) - { - views.clear(); - } - - @After - public void end() throws Throwable - { - endTearDown(views, version, this); - } - - public static void endTearDown(List<String> views, ProtocolVersion version, CQLTester cqlTester) throws Throwable - { - for (String viewName : views) - cqlTester.executeNet(version, "DROP MATERIALIZED VIEW " + viewName); - } - - public static void createView(String name, String query, ProtocolVersion version, CQLTester cqlTester, List<String> views) throws Throwable - { - try - { - cqlTester.executeNet(version, String.format(query, name)); - // If exception is thrown, the view will not be added to the list; since it shouldn't have been created, this is - // the desired behavior - views.add(name); - } - catch (OperationTimedOutException ex) - { - // ... except for timeout, when we actually do not know whether the view was created or not - views.add(name); - throw ex; - } - } - - public static void updateView(String query, ProtocolVersion version, CQLTester cqlTester, Object... params) throws Throwable - { - updateViewWithFlush(query, false, version, cqlTester, params); - } - - public static void updateViewWithFlush(String query, boolean flush, ProtocolVersion version, CQLTester cqlTester, Object... params) throws Throwable - { - cqlTester.executeNet(version, query, params); - while (!(((SEPExecutor) Stage.VIEW_MUTATION.executor()).getPendingTaskCount() == 0 - && ((SEPExecutor) Stage.VIEW_MUTATION.executor()).getActiveTaskCount() == 0)) - { - Thread.sleep(1); - } - if (flush) - Keyspace.open(cqlTester.keyspace()).flush(); - } - @Test public void testNonBaseColumnInViewPkWithFlush() throws Throwable { @@ -145,10 +58,10 @@ public class ViewComplexTest extends CQLTester @Test public void testNonBaseColumnInViewPkWithoutFlush() throws Throwable { - testNonBaseColumnInViewPk(true); + testNonBaseColumnInViewPk(false); } - public void testNonBaseColumnInViewPk(boolean flush) throws Throwable + private void testNonBaseColumnInViewPk(boolean flush) throws Throwable { createTable("create table %s (p1 int, p2 int, v1 int, v2 int, primary key (p1,p2))"); @@ -156,50 +69,47 @@ public class ViewComplexTest extends CQLTester executeNet(version, "USE " + keyspace()); Keyspace ks = Keyspace.open(keyspace()); - createView("mv", - "create materialized view %s as select * from %%s where p1 is not null and p2 is not null primary key (p2, p1)" - + " with gc_grace_seconds=5;", - version, - this, - views); - ColumnFamilyStore cfs = ks.getColumnFamilyStore("mv"); + String mv = createView("create materialized view %s as select * from %%s " + + "where p1 is not null and p2 is not null primary key (p2, p1) " + + "with gc_grace_seconds=5"); + ColumnFamilyStore cfs = ks.getColumnFamilyStore(mv); cfs.disableAutoCompaction(); - updateView("UPDATE %s USING TIMESTAMP 1 set v1 =1 where p1 = 1 AND p2 = 1;", version, this); + updateView("UPDATE %s USING TIMESTAMP 1 set v1 =1 where p1 = 1 AND p2 = 1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from %s"), row(1, 1, 1, null)); - assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from mv"), row(1, 1, 1, null)); + assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from " + mv), row(1, 1, 1, null)); - updateView("UPDATE %s USING TIMESTAMP 2 set v1 = null, v2 = 1 where p1 = 1 AND p2 = 1;", version, this); + updateView("UPDATE %s USING TIMESTAMP 2 set v1 = null, v2 = 1 where p1 = 1 AND p2 = 1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from %s"), row(1, 1, null, 1)); - assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from mv"), row(1, 1, null, 1)); + assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from " + mv), row(1, 1, null, 1)); - updateView("UPDATE %s USING TIMESTAMP 2 set v2 = null where p1 = 1 AND p2 = 1;", version, this); + updateView("UPDATE %s USING TIMESTAMP 2 set v2 = null where p1 = 1 AND p2 = 1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from %s")); - assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from mv")); + assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from " + mv)); - updateView("INSERT INTO %s (p1,p2) VALUES(1,1) USING TIMESTAMP 3;", version, this); + updateView("INSERT INTO %s (p1,p2) VALUES(1,1) USING TIMESTAMP 3;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from %s"), row(1, 1, null, null)); - assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from mv"), row(1, 1, null, null)); + assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from " + mv), row(1, 1, null, null)); - updateView("DELETE FROM %s USING TIMESTAMP 4 WHERE p1 =1 AND p2 = 1;", version, this); + updateView("DELETE FROM %s USING TIMESTAMP 4 WHERE p1 =1 AND p2 = 1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from %s")); - assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from mv")); + assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from " + mv)); - updateView("UPDATE %s USING TIMESTAMP 5 set v2 = 1 where p1 = 1 AND p2 = 1;", version, this); + updateView("UPDATE %s USING TIMESTAMP 5 set v2 = 1 where p1 = 1 AND p2 = 1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from %s"), row(1, 1, null, 1)); - assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from mv"), row(1, 1, null, 1)); + assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from " + mv), row(1, 1, null, 1)); } @Test @@ -222,58 +132,55 @@ public class ViewComplexTest extends CQLTester executeNet(version, "USE " + keyspace()); Keyspace ks = Keyspace.open(keyspace()); - createView("mv", - "create materialized view %s as select * from %%s where p is not null and v1 is not null primary key (v1, p);", - version, - this, - views); - ks.getColumnFamilyStore("mv").disableAutoCompaction(); + String mv = createView("create materialized view %s as select * from %%s " + + "where p is not null and v1 is not null primary key (v1, p)"); + ks.getColumnFamilyStore(mv).disableAutoCompaction(); // sstable 1, Set initial values TS=1 - updateView("Insert into %s (p, v1, v2) values (3, 1, 3) using timestamp 1;", version, this); + updateView("Insert into %s (p, v1, v2) values (3, 1, 3) using timestamp 1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v2, WRITETIME(v2) from mv WHERE v1 = ? AND p = ?", 1, 3), row(3, 1L)); + assertRowsIgnoringOrder(execute("SELECT v2, WRITETIME(v2) from " + mv + " WHERE v1 = ? AND p = ?", 1, 3), row(3, 1L)); // sstable 2 - updateView("UPdate %s using timestamp 2 set v2 = null where p = 3", version, this); + updateView("UPdate %s using timestamp 2 set v2 = null where p = 3"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v2, WRITETIME(v2) from mv WHERE v1 = ? AND p = ?", 1, 3), + assertRowsIgnoringOrder(execute("SELECT v2, WRITETIME(v2) from " + mv + " WHERE v1 = ? AND p = ?", 1, 3), row(null, null)); // sstable 3 - updateView("UPdate %s using timestamp 3 set v1 = 2 where p = 3", version, this); + updateView("UPdate %s using timestamp 3 set v1 = 2 where p = 3"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from mv"), row(2, 3, null, null)); + assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(2, 3, null, null)); // sstable 4 - updateView("UPdate %s using timestamp 4 set v1 = 1 where p = 3", version, this); + updateView("UPdate %s using timestamp 4 set v1 = 1 where p = 3"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from mv"), row(1, 3, null, null)); + assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, null, null)); if (flush) { // compact sstable 2 and 3; - ColumnFamilyStore cfs = ks.getColumnFamilyStore("mv"); + ColumnFamilyStore cfs = ks.getColumnFamilyStore(mv); List<String> sstables = cfs.getLiveSSTables() .stream() .sorted(Comparator.comparingInt(s -> s.descriptor.generation)) - .map(s -> s.getFilename()) + .map(SSTableReader::getFilename) .collect(Collectors.toList()); String dataFiles = String.join(",", Arrays.asList(sstables.get(1), sstables.get(2))); CompactionManager.instance.forceUserDefinedCompaction(dataFiles); } // cell-tombstone in sstable 4 is not compacted away, because the shadowable tombstone is shadowed by new row. - assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from mv"), row(1, 3, null, null)); - assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from mv limit 1"), row(1, 3, null, null)); + assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, null, null)); + assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv + " limit 1"), row(1, 3, null, null)); } @Test @@ -313,58 +220,57 @@ public class ViewComplexTest extends CQLTester for (int i = 0; i < mvStatements.size(); i++) { - String name = "mv" + i; + String name = createView(mvStatements.get(i)); viewNames.add(name); - createView(name, mvStatements.get(i), version, this, views); ks.getColumnFamilyStore(name).disableAutoCompaction(); } // insert - updateViewWithFlush("INSERT INTO %s (a,b,c,d,e,f) VALUES(1,1,1,1,1,1) using timestamp 1", flush, version, this); + updateViewWithFlush("INSERT INTO %s (a,b,c,d,e,f) VALUES(1,1,1,1,1,1) using timestamp 1", flush); assertBaseViews(row(1, 1, 1, 1, 1, 1), viewNames); - updateViewWithFlush("UPDATE %s using timestamp 2 SET c=0, d=0 WHERE a=1 AND b=1", flush, version, this); + updateViewWithFlush("UPDATE %s using timestamp 2 SET c=0, d=0 WHERE a=1 AND b=1", flush); assertBaseViews(row(1, 1, 0, 0, 1, 1), viewNames); - updateViewWithFlush("UPDATE %s using timestamp 2 SET e=0, f=0 WHERE a=1 AND b=1", flush, version, this); + updateViewWithFlush("UPDATE %s using timestamp 2 SET e=0, f=0 WHERE a=1 AND b=1", flush); assertBaseViews(row(1, 1, 0, 0, 0, 0), viewNames); - updateViewWithFlush("DELETE FROM %s using timestamp 2 WHERE a=1 AND b=1", flush, version, this); + updateViewWithFlush("DELETE FROM %s using timestamp 2 WHERE a=1 AND b=1", flush); assertBaseViews(null, viewNames); // partial update unselected, selected - updateViewWithFlush("UPDATE %s using timestamp 3 SET f=1 WHERE a=1 AND b=1", flush, version, this); + updateViewWithFlush("UPDATE %s using timestamp 3 SET f=1 WHERE a=1 AND b=1", flush); assertBaseViews(row(1, 1, null, null, null, 1), viewNames); - updateViewWithFlush("UPDATE %s using timestamp 4 SET e = 1, f=null WHERE a=1 AND b=1", flush, version, this); + updateViewWithFlush("UPDATE %s using timestamp 4 SET e = 1, f=null WHERE a=1 AND b=1", flush); assertBaseViews(row(1, 1, null, null, 1, null), viewNames); - updateViewWithFlush("UPDATE %s using timestamp 4 SET e = null WHERE a=1 AND b=1", flush, version, this); + updateViewWithFlush("UPDATE %s using timestamp 4 SET e = null WHERE a=1 AND b=1", flush); assertBaseViews(null, viewNames); - updateViewWithFlush("UPDATE %s using timestamp 5 SET c = 1 WHERE a=1 AND b=1", flush, version, this); + updateViewWithFlush("UPDATE %s using timestamp 5 SET c = 1 WHERE a=1 AND b=1", flush); assertBaseViews(row(1, 1, 1, null, null, null), viewNames); - updateViewWithFlush("UPDATE %s using timestamp 5 SET c = null WHERE a=1 AND b=1", flush, version, this); + updateViewWithFlush("UPDATE %s using timestamp 5 SET c = null WHERE a=1 AND b=1", flush); assertBaseViews(null, viewNames); - updateViewWithFlush("UPDATE %s using timestamp 6 SET d = 1 WHERE a=1 AND b=1", flush, version, this); + updateViewWithFlush("UPDATE %s using timestamp 6 SET d = 1 WHERE a=1 AND b=1", flush); assertBaseViews(row(1, 1, null, 1, null, null), viewNames); - updateViewWithFlush("UPDATE %s using timestamp 7 SET d = null WHERE a=1 AND b=1", flush, version, this); + updateViewWithFlush("UPDATE %s using timestamp 7 SET d = null WHERE a=1 AND b=1", flush); assertBaseViews(null, viewNames); - updateViewWithFlush("UPDATE %s using timestamp 8 SET f = 1 WHERE a=1 AND b=1", flush, version, this); + updateViewWithFlush("UPDATE %s using timestamp 8 SET f = 1 WHERE a=1 AND b=1", flush); assertBaseViews(row(1, 1, null, null, null, 1), viewNames); - updateViewWithFlush("UPDATE %s using timestamp 6 SET c = 1 WHERE a=1 AND b=1", flush, version, this); + updateViewWithFlush("UPDATE %s using timestamp 6 SET c = 1 WHERE a=1 AND b=1", flush); assertBaseViews(row(1, 1, 1, null, null, 1), viewNames); // view row still alive due to c=1@6 - updateViewWithFlush("UPDATE %s using timestamp 8 SET f = null WHERE a=1 AND b=1", flush, version, this); + updateViewWithFlush("UPDATE %s using timestamp 8 SET f = null WHERE a=1 AND b=1", flush); assertBaseViews(row(1, 1, 1, null, null, null), viewNames); - updateViewWithFlush("UPDATE %s using timestamp 6 SET c = null WHERE a=1 AND b=1", flush, version, this); + updateViewWithFlush("UPDATE %s using timestamp 6 SET c = null WHERE a=1 AND b=1", flush); assertBaseViews(null, viewNames); } diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexTester.java b/test/unit/org/apache/cassandra/cql3/ViewComplexTester.java new file mode 100644 index 0000000..a934649 --- /dev/null +++ b/test/unit/org/apache/cassandra/cql3/ViewComplexTester.java @@ -0,0 +1,130 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.cassandra.cql3; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +import org.junit.After; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import com.datastax.driver.core.exceptions.OperationTimedOutException; +import org.apache.cassandra.concurrent.Stage; +import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.transport.ProtocolVersion; + +/* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670) + * Any changes here check if they apply to the other classes: + * - ViewComplexUpdatesTest + * - ViewComplexDeletionsTest + * - ViewComplexTTLTest + * - ViewComplexTest + * - ViewComplexLivenessTest + */ +@RunWith(Parameterized.class) +public abstract class ViewComplexTester extends CQLTester +{ + private static final AtomicInteger seqNumber = new AtomicInteger(); + + @Parameterized.Parameter + public ProtocolVersion version; + + @Parameterized.Parameters() + public static Collection<Object[]> versions() + { + return ProtocolVersion.SUPPORTED.stream() + .map(v -> new Object[]{v}) + .collect(Collectors.toList()); + } + + protected final List<String> views = new ArrayList<>(); + + @BeforeClass + public static void startup() + { + requireNetwork(); + } + + @Before + public void begin() throws Throwable + { + views.clear(); + } + + @After + public void end() throws Throwable + { + dropMViews(); + } + + protected void dropMViews() throws Throwable + { + for (String viewName : views) + executeNet(version, "DROP MATERIALIZED VIEW " + viewName); + } + + protected String createView(String query) throws Throwable + { + String name = createViewName(); + + try + { + executeNet(version, String.format(query, name)); + // If exception is thrown, the view will not be added to the list; since it shouldn't have been created, this is + // the desired behavior + views.add(name); + } + catch (OperationTimedOutException ex) + { + // ... except for timeout, when we actually do not know whether the view was created or not + views.add(name); + throw ex; + } + + return name; + } + + protected static String createViewName() + { + return "mv" + seqNumber.getAndIncrement(); + } + + protected void updateView(String query, Object... params) throws Throwable + { + updateViewWithFlush(query, false, params); + } + + protected void updateViewWithFlush(String query, boolean flush, Object... params) throws Throwable + { + executeNet(version, query, params); + while (!(Stage.VIEW_MUTATION.executor().getPendingTaskCount() == 0 + && Stage.VIEW_MUTATION.executor().getActiveTaskCount() == 0)) + { + Thread.sleep(1); + } + if (flush) + Keyspace.open(keyspace()).flush(); + } +} diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexUpdatesTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexUpdatesTest.java index f2a627d..76ae361 100644 --- a/test/unit/org/apache/cassandra/cql3/ViewComplexUpdatesTest.java +++ b/test/unit/org/apache/cassandra/cql3/ViewComplexUpdatesTest.java @@ -18,25 +18,13 @@ package org.apache.cassandra.cql3; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; import java.util.concurrent.TimeUnit; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.apache.cassandra.db.Keyspace; -import org.apache.cassandra.transport.ProtocolVersion; import org.apache.cassandra.utils.FBUtilities; -import static org.apache.cassandra.cql3.ViewComplexTest.createView; -import static org.apache.cassandra.cql3.ViewComplexTest.updateView; - /* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670) * Any changes here check if they apply to the other classes: * - ViewComplexUpdatesTest @@ -45,38 +33,8 @@ import static org.apache.cassandra.cql3.ViewComplexTest.updateView; * - ViewComplexTest * - ViewComplexLivenessTest */ -@RunWith(Parameterized.class) -public class ViewComplexUpdatesTest extends CQLTester +public class ViewComplexUpdatesTest extends ViewComplexTester { - @Parameterized.Parameter - public ProtocolVersion version; - - @Parameterized.Parameters() - public static Collection<Object[]> versions() - { - return ViewComplexTest.versions(); - } - - private final List<String> views = new ArrayList<>(); - - @BeforeClass - public static void startup() - { - ViewComplexTest.startup(); - } - - @Before - public void begin() - { - ViewComplexTest.beginSetup(views); - } - - @After - public void end() throws Throwable - { - ViewComplexTest.endTearDown(views, version, this); - } - @Test public void testUpdateColumnNotInViewWithFlush() throws Throwable { @@ -99,90 +57,87 @@ public class ViewComplexUpdatesTest extends CQLTester executeNet(version, "USE " + keyspace()); Keyspace ks = Keyspace.open(keyspace()); - createView("mv", - "CREATE MATERIALIZED VIEW %s AS SELECT p, c FROM %%s WHERE p IS NOT NULL AND c IS NOT NULL PRIMARY KEY (c, p);", - version, - this, - views); - ks.getColumnFamilyStore("mv").disableAutoCompaction(); + String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT p, c FROM %%s " + + "WHERE p IS NOT NULL AND c IS NOT NULL PRIMARY KEY (c, p)"); + ks.getColumnFamilyStore(mv).disableAutoCompaction(); - updateView("UPDATE %s USING TIMESTAMP 0 SET v1 = 1 WHERE p = 0 AND c = 0", version, this); + updateView("UPDATE %s USING TIMESTAMP 0 SET v1 = 1 WHERE p = 0 AND c = 0"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0, 1, null)); - assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = ?", 0, 0), row(0, 0)); + assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0)); - updateView("DELETE v1 FROM %s USING TIMESTAMP 1 WHERE p = 0 AND c = 0", version, this); + updateView("DELETE v1 FROM %s USING TIMESTAMP 1 WHERE p = 0 AND c = 0"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertEmpty(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0)); - assertEmpty(execute("SELECT * from mv WHERE c = ? AND p = ?", 0, 0)); + assertEmpty(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0)); // shadowed by tombstone - updateView("UPDATE %s USING TIMESTAMP 1 SET v1 = 1 WHERE p = 0 AND c = 0", version, this); + updateView("UPDATE %s USING TIMESTAMP 1 SET v1 = 1 WHERE p = 0 AND c = 0"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertEmpty(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0)); - assertEmpty(execute("SELECT * from mv WHERE c = ? AND p = ?", 0, 0)); + assertEmpty(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0)); - updateView("UPDATE %s USING TIMESTAMP 2 SET v2 = 1 WHERE p = 0 AND c = 0", version, this); + updateView("UPDATE %s USING TIMESTAMP 2 SET v2 = 1 WHERE p = 0 AND c = 0"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0, null, 1)); - assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = ?", 0, 0), row(0, 0)); + assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0)); - updateView("DELETE v1 FROM %s USING TIMESTAMP 3 WHERE p = 0 AND c = 0", version, this); + updateView("DELETE v1 FROM %s USING TIMESTAMP 3 WHERE p = 0 AND c = 0"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0, null, 1)); - assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = ?", 0, 0), row(0, 0)); + assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0)); - updateView("DELETE v2 FROM %s USING TIMESTAMP 4 WHERE p = 0 AND c = 0", version, this); + updateView("DELETE v2 FROM %s USING TIMESTAMP 4 WHERE p = 0 AND c = 0"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertEmpty(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0)); - assertEmpty(execute("SELECT * from mv WHERE c = ? AND p = ?", 0, 0)); + assertEmpty(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0)); - updateView("UPDATE %s USING TTL 3 SET v2 = 1 WHERE p = 0 AND c = 0", version, this); + updateView("UPDATE %s USING TTL 3 SET v2 = 1 WHERE p = 0 AND c = 0"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0, null, 1)); - assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = ?", 0, 0), row(0, 0)); + assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0)); Thread.sleep(TimeUnit.SECONDS.toMillis(3)); assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0)); - assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = ?", 0, 0)); + assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0)); - updateView("UPDATE %s SET v2 = 1 WHERE p = 0 AND c = 0", version, this); + updateView("UPDATE %s SET v2 = 1 WHERE p = 0 AND c = 0"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0, null, 1)); - assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = ?", 0, 0), row(0, 0)); + assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0)); assertInvalidMessage(String.format("Cannot drop column v2 on base table %s with materialized views", baseTable), "ALTER TABLE %s DROP v2"); // // drop unselected base column, unselected metadata should be removed, thus view row is dead // updateView("ALTER TABLE %s DROP v2"); // assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0)); - // assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = ?", 0, 0)); + // assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0)); // assertRowsIgnoringOrder(execute("SELECT * from %s")); - // assertRowsIgnoringOrder(execute("SELECT * from mv")); + // assertRowsIgnoringOrder(execute("SELECT * from " + mv)); } @Test @@ -197,56 +152,53 @@ public class ViewComplexUpdatesTest extends CQLTester testPartialUpdateWithUnselectedCollections(false); } - public void testPartialUpdateWithUnselectedCollections(boolean flush) throws Throwable + private void testPartialUpdateWithUnselectedCollections(boolean flush) throws Throwable { execute("USE " + keyspace()); executeNet(version, "USE " + keyspace()); String baseTable = createTable("CREATE TABLE %s (k int, c int, a int, b int, l list<int>, s set<int>, m map<int,int>, PRIMARY KEY (k, c))"); - createView("mv", - "CREATE MATERIALIZED VIEW %s AS SELECT a, b, c, k FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (c, k)", - version, - this, - views); + String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT a, b, c, k FROM %%s " + + "WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (c, k)"); Keyspace ks = Keyspace.open(keyspace()); - ks.getColumnFamilyStore("mv").disableAutoCompaction(); + ks.getColumnFamilyStore(mv).disableAutoCompaction(); - updateView("UPDATE %s SET l=l+[1,2,3] WHERE k = 1 AND c = 1", version, this); + updateView("UPDATE %s SET l=l+[1,2,3] WHERE k = 1 AND c = 1"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRows(execute("SELECT * from mv"), row(1, 1, null, null)); + assertRows(execute("SELECT * from " + mv), row(1, 1, null, null)); - updateView("UPDATE %s SET l=l-[1,2] WHERE k = 1 AND c = 1", version, this); + updateView("UPDATE %s SET l=l-[1,2] WHERE k = 1 AND c = 1"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRows(execute("SELECT * from mv"), row(1, 1, null, null)); + assertRows(execute("SELECT * from " + mv), row(1, 1, null, null)); - updateView("UPDATE %s SET b=3 WHERE k=1 AND c=1", version, this); + updateView("UPDATE %s SET b=3 WHERE k=1 AND c=1"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRows(execute("SELECT * from mv"), row(1, 1, null, 3)); + assertRows(execute("SELECT * from " + mv), row(1, 1, null, 3)); - updateView("UPDATE %s SET b=null, l=l-[3], s=s-{3} WHERE k = 1 AND c = 1", version, this); + updateView("UPDATE %s SET b=null, l=l-[3], s=s-{3} WHERE k = 1 AND c = 1"); if (flush) { FBUtilities.waitOnFutures(ks.flush()); - ks.getColumnFamilyStore("mv").forceMajorCompaction(); + ks.getColumnFamilyStore(mv).forceMajorCompaction(); } assertRowsIgnoringOrder(execute("SELECT k,c,a,b from %s")); - assertRowsIgnoringOrder(execute("SELECT * from mv")); + assertRowsIgnoringOrder(execute("SELECT * from " + mv)); - updateView("UPDATE %s SET m=m+{3:3}, l=l-[1], s=s-{2} WHERE k = 1 AND c = 1", version, this); + updateView("UPDATE %s SET m=m+{3:3}, l=l-[1], s=s-{2} WHERE k = 1 AND c = 1"); if (flush) FBUtilities.waitOnFutures(ks.flush()); assertRowsIgnoringOrder(execute("SELECT k,c,a,b from %s"), row(1, 1, null, null)); - assertRowsIgnoringOrder(execute("SELECT * from mv"), row(1, 1, null, null)); + assertRowsIgnoringOrder(execute("SELECT * from " + mv), row(1, 1, null, null)); assertInvalidMessage(String.format("Cannot drop column m on base table %s with materialized views", baseTable), "ALTER TABLE %s DROP m"); // executeNet(version, "ALTER TABLE %s DROP m"); - // ks.getColumnFamilyStore("mv").forceMajorCompaction(); + // ks.getColumnFamilyStore(mv).forceMajorCompaction(); // assertRowsIgnoringOrder(execute("SELECT k,c,a,b from %s WHERE k = 1 AND c = 1")); - // assertRowsIgnoringOrder(execute("SELECT * from mv WHERE k = 1 AND c = 1")); + // assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE k = 1 AND c = 1")); // assertRowsIgnoringOrder(execute("SELECT k,c,a,b from %s")); - // assertRowsIgnoringOrder(execute("SELECT * from mv")); + // assertRowsIgnoringOrder(execute("SELECT * from " + mv)); } @Test @@ -261,7 +213,7 @@ public class ViewComplexUpdatesTest extends CQLTester testUpdateWithColumnTimestampSmallerThanPk(false); } - public void testUpdateWithColumnTimestampSmallerThanPk(boolean flush) throws Throwable + private void testUpdateWithColumnTimestampSmallerThanPk(boolean flush) throws Throwable { createTable("create table %s (p int primary key, v1 int, v2 int)"); @@ -269,34 +221,31 @@ public class ViewComplexUpdatesTest extends CQLTester executeNet(version, "USE " + keyspace()); Keyspace ks = Keyspace.open(keyspace()); - createView("mv", - "create materialized view %s as select * from %%s where p is not null and v1 is not null primary key (v1, p);", - version, - this, - views); - ks.getColumnFamilyStore("mv").disableAutoCompaction(); + String mv = createView("create materialized view %s as select * from %%s " + + "where p is not null and v1 is not null primary key (v1, p)"); + ks.getColumnFamilyStore(mv).disableAutoCompaction(); // reset value - updateView("Insert into %s (p, v1, v2) values (3, 1, 3) using timestamp 6;", version, this); + updateView("Insert into %s (p, v1, v2) values (3, 1, 3) using timestamp 6;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from mv"), row(1, 3, 3, 6L)); + assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, 3, 6L)); // increase pk's timestamp to 20 - updateView("Insert into %s (p) values (3) using timestamp 20;", version, this); + updateView("Insert into %s (p) values (3) using timestamp 20;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from mv"), row(1, 3, 3, 6L)); + assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, 3, 6L)); // change v1's to 2 and remove existing view row with ts7 - updateView("UPdate %s using timestamp 7 set v1 = 2 where p = 3;", version, this); + updateView("UPdate %s using timestamp 7 set v1 = 2 where p = 3;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from mv"), row(2, 3, 3, 6L)); - assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from mv limit 1"), row(2, 3, 3, 6L)); + assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(2, 3, 3, 6L)); + assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv + " limit 1"), row(2, 3, 3, 6L)); // change v1's to 1 and remove existing view row with ts8 - updateView("UPdate %s using timestamp 8 set v1 = 1 where p = 3;", version, this); + updateView("UPdate %s using timestamp 8 set v1 = 1 where p = 3;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from mv"), row(1, 3, 3, 6L)); + assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, 3, 6L)); } @Test @@ -313,7 +262,7 @@ public class ViewComplexUpdatesTest extends CQLTester testUpdateWithColumnTimestampBiggerThanPk(false); } - public void testUpdateWithColumnTimestampBiggerThanPk(boolean flush) throws Throwable + private void testUpdateWithColumnTimestampBiggerThanPk(boolean flush) throws Throwable { // CASSANDRA-11500 able to shadow old view row with column ts greater tahn pk's ts and re-insert the view row String baseTable = createTable("CREATE TABLE %s (k int PRIMARY KEY, a int, b int);"); @@ -322,50 +271,47 @@ public class ViewComplexUpdatesTest extends CQLTester executeNet(version, "USE " + keyspace()); Keyspace ks = Keyspace.open(keyspace()); - createView("mv", - "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE k IS NOT NULL AND a IS NOT NULL PRIMARY KEY (k, a);", - version, - this, - views); - ks.getColumnFamilyStore("mv").disableAutoCompaction(); - updateView("DELETE FROM %s USING TIMESTAMP 0 WHERE k = 1;", version, this); + String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " + + "WHERE k IS NOT NULL AND a IS NOT NULL PRIMARY KEY (k, a)"); + ks.getColumnFamilyStore(mv).disableAutoCompaction(); + updateView("DELETE FROM %s USING TIMESTAMP 0 WHERE k = 1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); // sstable-1, Set initial values TS=1 - updateView("INSERT INTO %s(k, a, b) VALUES (1, 1, 1) USING TIMESTAMP 1;", version, this); + updateView("INSERT INTO %s(k, a, b) VALUES (1, 1, 1) USING TIMESTAMP 1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT k,a,b from mv"), row(1, 1, 1)); - updateView("UPDATE %s USING TIMESTAMP 10 SET b = 2 WHERE k = 1;", version, this); - assertRowsIgnoringOrder(execute("SELECT k,a,b from mv"), row(1, 1, 2)); + assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv), row(1, 1, 1)); + updateView("UPDATE %s USING TIMESTAMP 10 SET b = 2 WHERE k = 1;"); + assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv), row(1, 1, 2)); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT k,a,b from mv"), row(1, 1, 2)); - updateView("UPDATE %s USING TIMESTAMP 2 SET a = 2 WHERE k = 1;", version, this); - assertRowsIgnoringOrder(execute("SELECT k,a,b from mv"), row(1, 2, 2)); + assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv), row(1, 1, 2)); + updateView("UPDATE %s USING TIMESTAMP 2 SET a = 2 WHERE k = 1;"); + assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv), row(1, 2, 2)); if (flush) FBUtilities.waitOnFutures(ks.flush()); - ks.getColumnFamilyStore("mv").forceMajorCompaction(); - assertRowsIgnoringOrder(execute("SELECT k,a,b from mv"), row(1, 2, 2)); - assertRowsIgnoringOrder(execute("SELECT k,a,b from mv limit 1"), row(1, 2, 2)); - updateView("UPDATE %s USING TIMESTAMP 11 SET a = 1 WHERE k = 1;", version, this); + ks.getColumnFamilyStore(mv).forceMajorCompaction(); + assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv), row(1, 2, 2)); + assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv + " limit 1"), row(1, 2, 2)); + updateView("UPDATE %s USING TIMESTAMP 11 SET a = 1 WHERE k = 1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT k,a,b from mv"), row(1, 1, 2)); + assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv), row(1, 1, 2)); assertRowsIgnoringOrder(execute("SELECT k,a,b from %s"), row(1, 1, 2)); // set non-key base column as tombstone, view row is removed with shadowable - updateView("UPDATE %s USING TIMESTAMP 12 SET a = null WHERE k = 1;", version, this); + updateView("UPDATE %s USING TIMESTAMP 12 SET a = null WHERE k = 1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT k,a,b from mv")); + assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv)); assertRowsIgnoringOrder(execute("SELECT k,a,b from %s"), row(1, null, 2)); // column b should be alive - updateView("UPDATE %s USING TIMESTAMP 13 SET a = 1 WHERE k = 1;", version, this); + updateView("UPDATE %s USING TIMESTAMP 13 SET a = 1 WHERE k = 1;"); if (flush) FBUtilities.waitOnFutures(ks.flush()); - assertRowsIgnoringOrder(execute("SELECT k,a,b from mv"), row(1, 1, 2)); + assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv), row(1, 1, 2)); assertRowsIgnoringOrder(execute("SELECT k,a,b from %s"), row(1, 1, 2)); assertInvalidMessage(String.format("Cannot drop column a on base table %s with materialized views", baseTable), "ALTER TABLE %s DROP a"); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org