This is an automated email from the ASF dual-hosted git repository.

smiklosovic 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 38a625b21a Allow CQLSSTableWriter to specify SSTable id generator to 
use
38a625b21a is described below

commit 38a625b21a028f845f16f6c0e7bc10ecf6914cb8
Author: Arvind Kandpal <[email protected]>
AuthorDate: Wed Sep 2 15:08:22 2026 +0530

    Allow CQLSSTableWriter to specify SSTable id generator to use
    
    patch by Arvind Kandpal; reviewed by Bernardo Botella, Stefan Miklosovic 
for CASSANDRA-21012
---
 CHANGES.txt                                        |  1 +
 .../io/sstable/AbstractSSTableSimpleWriter.java    | 15 +++++--
 .../cassandra/io/sstable/CQLSSTableWriter.java     | 11 ++++-
 .../io/sstable/SSTableSimpleUnsortedWriter.java    |  9 ++++-
 .../cassandra/io/sstable/SSTableSimpleWriter.java  |  9 ++++-
 .../cassandra/io/sstable/CQLSSTableWriterTest.java | 47 ++++++++++++++++++++++
 6 files changed, 82 insertions(+), 10 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 2230e62c4f..5eca072610 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 7.0
+ * Allow CQLSSTableWriter to specify SSTable id generator to use 
(CASSANDRA-21012)
  * Reject LIKE patterns with a wildcard (%) anywhere other than the start or 
end (CASSANDRA-21068)
  * Support pluggable default role initialization (CASSANDRA-21546)
  * Add prepared statement cache stats to nodetool info (CASSANDRA-14366)
diff --git 
a/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java 
b/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java
index 2487e66fd2..67d6915da0 100644
--- a/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java
@@ -30,6 +30,8 @@ import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Consumer;
 import java.util.stream.Stream;
 
+import javax.annotation.Nullable;
+
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.RegularAndStaticColumns;
@@ -54,6 +56,7 @@ public abstract class AbstractSSTableSimpleWriter implements 
Closeable
     protected final RegularAndStaticColumns columns;
     protected SSTableFormat<?, ?> format = 
DatabaseDescriptor.getSelectedSSTableFormat();
     protected static final AtomicReference<SSTableId> id = new 
AtomicReference<>(SSTableIdFactory.instance.defaultBuilder().generator(Stream.empty()).get());
+    protected final SSTableId.Builder<? extends SSTableId> idBuilder;
     protected boolean makeRangeAware = false;
     protected final Collection<Index.Group> indexGroups;
     protected Consumer<Collection<SSTableReader>> sstableProducedListener;
@@ -61,11 +64,15 @@ public abstract class AbstractSSTableSimpleWriter 
implements Closeable
     protected CompressionDictionary compressionDictionary;
     protected SSTable.Owner owner;
 
-    protected AbstractSSTableSimpleWriter(File directory, TableMetadataRef 
metadata, RegularAndStaticColumns columns)
+    /**
+     * @param idBuilder builder used to generate SSTable identifiers; if 
{@code null}, the default builder is used.
+     */
+    protected AbstractSSTableSimpleWriter(File directory, TableMetadataRef 
metadata, RegularAndStaticColumns columns, @Nullable SSTableId.Builder<? 
extends SSTableId> idBuilder)
     {
         this.metadata = metadata;
         this.directory = directory;
         this.columns = columns;
+        this.idBuilder = idBuilder != null ? idBuilder : 
SSTableIdFactory.instance.defaultBuilder();
         indexGroups = new ArrayList<>();
     }
 
@@ -147,13 +154,13 @@ public abstract class AbstractSSTableSimpleWriter 
implements Closeable
                                        effectiveOwner);
     }
 
-    private static Descriptor createDescriptor(File directory, final String 
keyspace, final String columnFamily, final SSTableFormat<?, ?> fmt) throws 
IOException
+    private Descriptor createDescriptor(File directory, final String keyspace, 
final String columnFamily, final SSTableFormat<?, ?> fmt) throws IOException
     {
         SSTableId nextGen = getNextId(directory, columnFamily);
         return new Descriptor(directory, keyspace, columnFamily, nextGen, fmt);
     }
 
-    private static SSTableId getNextId(File directory, final String 
columnFamily) throws IOException
+    private SSTableId getNextId(File directory, final String columnFamily) 
throws IOException
     {
         while (true)
         {
@@ -165,7 +172,7 @@ public abstract class AbstractSSTableSimpleWriter 
implements Closeable
                                                              .map(d -> d.id);
 
                 SSTableId lastId = id.get();
-                SSTableId newId = 
SSTableIdFactory.instance.defaultBuilder().generator(Stream.concat(existingIds, 
Stream.of(lastId))).get();
+                SSTableId newId = 
idBuilder.generator(Stream.concat(existingIds, Stream.of(lastId))).get();
                 if (id.compareAndSet(lastId, newId))
                     return newId;
             }
diff --git a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java 
b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java
index 71f6efb161..ad47c8c2d5 100644
--- a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java
@@ -419,6 +419,7 @@ public class CQLSSTableWriter implements Closeable
         private Consumer<Collection<SSTableReader>> sstableProducedListener;
         private boolean openSSTableOnProduced = false;
         private CompressionDictionary compressionDictionary = null;
+        private SSTableId.Builder<? extends SSTableId> idBuilder = null;
 
         protected Builder()
         {
@@ -671,6 +672,12 @@ public class CQLSSTableWriter implements Closeable
             return this;
         }
 
+        public Builder withSSTableIdBuilder(SSTableId.Builder<? extends 
SSTableId> idBuilder)
+        {
+            this.idBuilder = idBuilder;
+            return this;
+        }
+
         /**
          * Use specific compression dictionary upon writing the data.
          *
@@ -800,8 +807,8 @@ public class CQLSSTableWriter implements Closeable
 
                 TableMetadataRef ref = tableMetadata.ref;
                 AbstractSSTableSimpleWriter writer = sorted
-                                                     ? new 
SSTableSimpleWriter(cfs, directory, ref, 
preparedModificationStatement.updatedColumns(), maxSSTableSizeInMiB)
-                                                     : new 
SSTableSimpleUnsortedWriter(cfs, directory, ref, 
preparedModificationStatement.updatedColumns(), maxSSTableSizeInMiB);
+                                                     ? new 
SSTableSimpleWriter(cfs, directory, ref, 
preparedModificationStatement.updatedColumns(), maxSSTableSizeInMiB, idBuilder)
+                                                     : new 
SSTableSimpleUnsortedWriter(cfs, directory, ref, 
preparedModificationStatement.updatedColumns(), maxSSTableSizeInMiB, idBuilder);
 
                 if (format != null)
                     writer.setSSTableFormatType(format);
diff --git 
a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java 
b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java
index d1c6a5fbc0..938c3b8452 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java
@@ -72,12 +72,17 @@ class SSTableSimpleUnsortedWriter extends 
AbstractSSTableSimpleWriter
 
     public SSTableSimpleUnsortedWriter(File directory, TableMetadataRef 
metadata, RegularAndStaticColumns columns, long maxSSTableSizeInMiB)
     {
-        this(null, directory, metadata, columns, maxSSTableSizeInMiB);
+        this(null, directory, metadata, columns, maxSSTableSizeInMiB, 
SSTableIdFactory.instance.defaultBuilder());
     }
 
     SSTableSimpleUnsortedWriter(SSTable.Owner owner, File directory, 
TableMetadataRef metadata, RegularAndStaticColumns columns, long 
maxSSTableSizeInMiB)
     {
-        super(directory, metadata, columns);
+        this(owner, directory, metadata, columns, maxSSTableSizeInMiB, 
SSTableIdFactory.instance.defaultBuilder());
+    }
+
+    SSTableSimpleUnsortedWriter(SSTable.Owner owner, File directory, 
TableMetadataRef metadata, RegularAndStaticColumns columns, long 
maxSSTableSizeInMiB, SSTableId.Builder<? extends SSTableId> idBuilder)
+    {
+        super(directory, metadata, columns, idBuilder);
         this.maxSStableSizeInBytes = maxSSTableSizeInMiB * 1024L * 1024L;
         this.header = new SerializationHeader(true, metadata.get(), columns, 
EncodingStats.NO_STATS);
         this.helper = new SerializationHelper(this.header);
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java 
b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java
index 7b5fb8a89e..dc2ed1a58d 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java
@@ -66,7 +66,7 @@ class SSTableSimpleWriter extends AbstractSSTableSimpleWriter
      */
     public SSTableSimpleWriter(File directory, TableMetadataRef metadata, 
RegularAndStaticColumns columns, long maxSSTableSizeInMiB)
     {
-        this(null, directory, metadata, columns, maxSSTableSizeInMiB);
+        this(null, directory, metadata, columns, maxSSTableSizeInMiB, 
SSTableIdFactory.instance.defaultBuilder());
     }
 
     /**
@@ -83,7 +83,12 @@ class SSTableSimpleWriter extends AbstractSSTableSimpleWriter
      */
     protected SSTableSimpleWriter(SSTable.Owner owner, File directory, 
TableMetadataRef metadata, RegularAndStaticColumns columns, long 
maxSSTableSizeInMiB)
     {
-        super(directory, metadata, columns);
+        this(owner, directory, metadata, columns, maxSSTableSizeInMiB, 
SSTableIdFactory.instance.defaultBuilder());
+    }
+
+    protected SSTableSimpleWriter(SSTable.Owner owner, File directory, 
TableMetadataRef metadata, RegularAndStaticColumns columns, long 
maxSSTableSizeInMiB, SSTableId.Builder<? extends SSTableId> idBuilder)
+    {
+        super(directory, metadata, columns, idBuilder);
         this.maxSSTableSizeInBytes = maxSSTableSizeInMiB * 1024L * 1024L;
         this.owner = owner;
     }
diff --git 
a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java 
b/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
index a6b4cc1b87..2cdecea526 100644
--- a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
@@ -146,6 +146,53 @@ public abstract class CQLSSTableWriterTest
         testWritingSstableWithFormat(btiFormat);
     }
 
+    @Test
+    public void testUUIDSSTableIdentifiers() throws Exception
+    {
+        String schema = "CREATE TABLE " + qualifiedTable + " ("
+                        + "  k int PRIMARY KEY,"
+                        + "  v int"
+                        + ")";
+        String insert = "INSERT INTO " + qualifiedTable + " (k, v) VALUES (?, 
?)";
+        CQLSSTableWriter writer = CQLSSTableWriter.builder()
+                                                  .inDirectory(dataDir)
+                                                  .forTable(schema)
+                                                  
.withSSTableIdBuilder(UUIDBasedSSTableId.Builder.instance)
+                                                  .using(insert).build();
+
+        writer.addRow(0, 1);
+        writer.close();
+
+        File[] dataFiles = dataDir.tryList((dir, name) -> 
name.contains("Data.db"));
+        assertEquals(1, dataFiles.length);
+
+        Descriptor descriptor = Descriptor.fromFile(dataFiles[0]);
+        
assertTrue(UUIDBasedSSTableId.Builder.instance.isUniqueIdentifier(descriptor.id.toString()));
+    }
+
+    @Test
+    public void testDefaultSSTableIdentifiersAreLegacy() throws Exception
+    {
+        String schema = "CREATE TABLE " + qualifiedTable + " ("
+                        + "  k int PRIMARY KEY,"
+                        + "  v int"
+                        + ")";
+        String insert = "INSERT INTO " + qualifiedTable + " (k, v) VALUES (?, 
?)";
+        CQLSSTableWriter writer = CQLSSTableWriter.builder()
+                                                  .inDirectory(dataDir)
+                                                  .forTable(schema)
+                                                  .using(insert).build();
+
+        writer.addRow(0, 1);
+        writer.close();
+
+        File[] dataFiles = dataDir.tryList((dir, name) -> 
name.contains("Data.db"));
+        assertEquals(1, dataFiles.length);
+
+        Descriptor descriptor = Descriptor.fromFile(dataFiles[0]);
+        
assertTrue(SequenceBasedSSTableId.Builder.instance.isUniqueIdentifier(descriptor.id.toString()));
+    }
+
     private void testWritingSstableWithFormat(SSTableFormat<?, ?> format) 
throws Exception
     {
         try (AutoCloseable ignored = 
Util.switchPartitioner(ByteOrderedPartitioner.instance))


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to