From 70626d685e0f8a4b09ac8b36ef9aa0a4a8f43c0d Mon Sep 17 00:00:00 2001 From: ssekaran Date: Mon, 16 Feb 2026 13:11:05 -0800 Subject: [PATCH] CASSANDRA-21177- Adding option for randomizing memtable type in Simulator tests --- .../simulator/ClusterSimulation.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/simulator/main/org/apache/cassandra/simulator/ClusterSimulation.java b/test/simulator/main/org/apache/cassandra/simulator/ClusterSimulation.java index f7f934638553..dae0ddfe6d81 100644 --- a/test/simulator/main/org/apache/cassandra/simulator/ClusterSimulation.java +++ b/test/simulator/main/org/apache/cassandra/simulator/ClusterSimulation.java @@ -38,6 +38,9 @@ import com.google.common.util.concurrent.AsyncFunction; import com.google.common.util.concurrent.FutureCallback; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.apache.cassandra.concurrent.ExecutorFactory; import org.apache.cassandra.config.ParameterizedClass; import org.apache.cassandra.distributed.Cluster; @@ -112,6 +115,8 @@ @SuppressWarnings("RedundantCast") public class ClusterSimulation implements AutoCloseable { + private static final Logger logger = LoggerFactory.getLogger(ClusterSimulation.class); + public static final Class[] SHARE = new Class[] { AsyncFunction.class, @@ -188,6 +193,7 @@ public static abstract class Builder protected HeapPool.Logged.Listener memoryListener; protected SimulatedTime.Listener timeListener = (i1, i2) -> {}; protected LongConsumer onThreadLocalRandomCheck; + protected Boolean useTrieMemtable = null; // null = random public Debug debug() { @@ -516,6 +522,12 @@ public Builder onThreadLocalRandomCheck(LongConsumer runnable) return this; } + public Builder useTrieMemtable(boolean useTrie) + { + this.useTrieMemtable = useTrie; + return this; + } + public abstract ClusterSimulation create(long seed) throws IOException; } @@ -654,6 +666,12 @@ public ClusterSimulation(RandomSource random, long seed, int uniqueNum, execution = new SimulatedExecution(); + boolean useTrieMemtable = builder.useTrieMemtable != null + ? builder.useTrieMemtable + : random.uniform(0, 2) == 0; // 50/50 chance + logger.info("Seed 0x{} using memtable: {}", Long.toHexString(seed), + useTrieMemtable ? "TrieMemtable" : "SkipListMemtable"); + KindOfSequence kindOfDriftSequence = Choices.uniform(KindOfSequence.values()).choose(random); KindOfSequence kindOfDiscontinuitySequence = Choices.uniform(KindOfSequence.values()).choose(random); time = new SimulatedTime(numOfNodes, random, 1577836800000L /*Jan 1st UTC*/, builder.clockDriftNanos, kindOfDriftSequence, @@ -700,6 +718,14 @@ public ClusterSimulation(RandomSource random, long seed, int uniqueNum, if (commitlogCompressed) config.set("commitlog_compression", new ParameterizedClass(LZ4Compressor.class.getName(), emptyMap())); + + if (useTrieMemtable) + { + config.set("memtable", Map.of( + "configurations", Map.of( + "default", Map.of("class_name", "TrieMemtable")))); + } + configUpdater.accept(threadAllocator.update(config)); }) .withInstanceInitializer(new IInstanceInitializer()