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]

Reply via email to