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]