This is an automated email from the ASF dual-hosted git repository.
brandonwilliams pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/trunk by this push:
new 1e685219da Add unit tests for per-row TTL and Timestamp usage in
CQLSSTableWriter
1e685219da is described below
commit 1e685219da4177fc5b5d6025618398532d2a0124
Author: Doug Rohrer <[email protected]>
AuthorDate: Mon Jan 23 13:53:09 2023 -0500
Add unit tests for per-row TTL and Timestamp usage in CQLSSTableWriter
Patch by Doug Rohrer; reviewed by brandonwilliams and dcapwell for
CASSANDRA-18187
CQLSSTableWriter supports per-row setting of both timestamp and TTL values,
but it’s not tested or documented today.
Add tests to cover setting both TTL and Timestamp values for rows using the
CQLSSTableWriter.
---
.../cassandra/io/sstable/CQLSSTableWriterTest.java | 118 +++++++++++++++++++++
1 file changed, 118 insertions(+)
diff --git
a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
b/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
index 1851314b5d..19e578bd7e 100644
--- a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
@@ -22,6 +22,7 @@ import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.*;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.BiPredicate;
import java.util.stream.Collectors;
@@ -55,6 +56,7 @@ import org.apache.cassandra.service.StorageService;
import org.apache.cassandra.transport.ProtocolVersion;
import org.apache.cassandra.utils.*;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -1116,6 +1118,122 @@ public class CQLSSTableWriterTest
assertEquals(0, filtered.size());
}
+ @Test
+ public void testWriteWithTimestamps() throws Exception
+ {
+ long now = currentTimeMillis();
+ long then = now - 1000;
+ final String schema = "CREATE TABLE " + qualifiedTable + " ("
+ + " k int,"
+ + " v1 int,"
+ + " v2 int,"
+ + " v3 text,"
+ + " PRIMARY KEY (k)"
+ + ")";
+
+ CQLSSTableWriter writer = CQLSSTableWriter.builder()
+ .inDirectory(dataDir)
+ .forTable(schema)
+ .using("INSERT INTO " +
qualifiedTable +
+ " (k, v1, v2, v3)
VALUES (?,?,?,?) using timestamp ?" )
+ .build();
+
+ // Note that, all other things being equal, Cassandra will sort these
rows lexicographically, so we use "higher" values in the
+ // row we expect to "win" so that we're sure that it isn't just
accidentally picked due to the row sorting.
+ writer.addRow( 1, 4, 5, "b", now); // This write should be the one
found at the end because it has a higher timestamp
+ writer.addRow( 1, 2, 3, "a", then);
+ writer.close();
+ loadSSTables(dataDir, keyspace);
+
+ UntypedResultSet resultSet = QueryProcessor.executeInternal("SELECT *
FROM " + qualifiedTable);
+ assertEquals(1, resultSet.size());
+
+ Iterator<UntypedResultSet.Row> iter = resultSet.iterator();
+ UntypedResultSet.Row r1 = iter.next();
+ assertEquals(1, r1.getInt("k"));
+ assertEquals(4, r1.getInt("v1"));
+ assertEquals(5, r1.getInt("v2"));
+ assertEquals("b", r1.getString("v3"));
+ assertFalse(iter.hasNext());
+ }
+ @Test
+ public void testWriteWithTtl() throws Exception
+ {
+ final String schema = "CREATE TABLE " + qualifiedTable + " ("
+ + " k int,"
+ + " v1 int,"
+ + " v2 int,"
+ + " v3 text,"
+ + " PRIMARY KEY (k)"
+ + ")";
+
+ CQLSSTableWriter.Builder builder = CQLSSTableWriter.builder()
+ .inDirectory(dataDir)
+ .forTable(schema)
+ .using("INSERT INTO "
+ qualifiedTable +
+ " (k, v1, v2,
v3) VALUES (?,?,?,?) using TTL ?");
+ CQLSSTableWriter writer = builder.build();
+ // add a row that _should_ show up - 1 hour TTL
+ writer.addRow( 1, 2, 3, "a", 3600);
+ // Insert a row with a TTL of 1 second - should not appear in results
once we sleep
+ writer.addRow( 2, 4, 5, "b", 1);
+ writer.close();
+ Thread.sleep(1200); // Slightly over 1 second, just to make sure
+ loadSSTables(dataDir, keyspace);
+
+ UntypedResultSet resultSet = QueryProcessor.executeInternal("SELECT *
FROM " + qualifiedTable);
+ assertEquals(1, resultSet.size());
+
+ Iterator<UntypedResultSet.Row> iter = resultSet.iterator();
+ UntypedResultSet.Row r1 = iter.next();
+ assertEquals(1, r1.getInt("k"));
+ assertEquals(2, r1.getInt("v1"));
+ assertEquals(3, r1.getInt("v2"));
+ assertEquals("a", r1.getString("v3"));
+ assertFalse(iter.hasNext());
+ }
+ @Test
+ public void testWriteWithTimestampsAndTtl() throws Exception
+ {
+ final String schema = "CREATE TABLE " + qualifiedTable + " ("
+ + " k int,"
+ + " v1 int,"
+ + " v2 int,"
+ + " v3 text,"
+ + " PRIMARY KEY (k)"
+ + ")";
+
+ CQLSSTableWriter writer = CQLSSTableWriter.builder()
+ .inDirectory(dataDir)
+ .forTable(schema)
+ .using("INSERT INTO " +
qualifiedTable +
+ " (k, v1, v2, v3)
VALUES (?,?,?,?) using timestamp ? AND TTL ?" )
+ .build();
+ // NOTE: It would be easier to make this a timestamp in the past, but
Cassandra also has a _local_ deletion time
+ // which is based on the server's timestamp, so simply setting the
timestamp to some time in the past
+ // doesn't actually do what you'd think it would do.
+ long oneSecondFromNow =
TimeUnit.MILLISECONDS.toMicros(currentTimeMillis() + 1000);
+ // Insert some rows with a timestamp of 1 second from now, and
different TTLs
+ // add a row that _should_ show up - 1 hour TTL
+ writer.addRow( 1, 2, 3, "a", oneSecondFromNow, 3600);
+ // Insert a row "two seconds ago" with a TTL of 1 second - should not
appear in results
+ writer.addRow( 2, 4, 5, "b", oneSecondFromNow, 1);
+ writer.close();
+ loadSSTables(dataDir, keyspace);
+ UntypedResultSet resultSet = QueryProcessor.executeInternal("SELECT *
FROM " + qualifiedTable);
+ Thread.sleep(1200);
+ resultSet = QueryProcessor.executeInternal("SELECT * FROM " +
qualifiedTable);
+ assertEquals(1, resultSet.size());
+
+ Iterator<UntypedResultSet.Row> iter = resultSet.iterator();
+ UntypedResultSet.Row r1 = iter.next();
+ assertEquals(1, r1.getInt("k"));
+ assertEquals(2, r1.getInt("v1"));
+ assertEquals(3, r1.getInt("v2"));
+ assertEquals("a", r1.getString("v3"));
+ assertFalse(iter.hasNext());
+ }
+
private static void loadSSTables(File dataDir, String ks) throws
ExecutionException, InterruptedException
{
SSTableLoader loader = new SSTableLoader(dataDir, new
SSTableLoader.Client()
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]