From 4bb162a550eb50767caa79efc7cff0cde6b3c91c Mon Sep 17 00:00:00 2001 From: Branimir Lambov Date: Fri, 29 Oct 2021 11:56:12 +0300 Subject: [PATCH] Fix offline tools startup --- .../cassandra/config/DatabaseDescriptor.java | 2 +- .../cassandra/db/ColumnFamilyStore.java | 8 +++- .../db/memtable/SkipListMemtable.java | 2 +- ...tory.java => SkipListMemtableFactory.java} | 42 ++++--------------- .../cassandra/schema/MemtableParams.java | 4 +- 5 files changed, 19 insertions(+), 39 deletions(-) rename src/java/org/apache/cassandra/db/memtable/{DefaultMemtableFactory.java => SkipListMemtableFactory.java} (56%) diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index 5b02bc345889..062ca5c67cb6 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -2899,7 +2899,7 @@ public static Float getMemtableCleanupThreshold() public static Map getMemtableOptions() { - return conf.memtable; + return conf != null ? conf.memtable : null; } public static int getIndexSummaryResizeIntervalInMinutes() diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index 740cf1ab0e50..2c96350fbd7f 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -393,10 +393,14 @@ public ColumnFamilyStore(Keyspace keyspace, logger.info("Initializing {}.{}", keyspace.getName(), name); - // Create Memtable only on online + // Create Memtable and its metrics object only on online Memtable initialMemtable = null; + TableMetrics.ReleasableMetric memtableMetrics = null; if (DatabaseDescriptor.isDaemonInitialized()) + { initialMemtable = createMemtable(new AtomicReference<>(CommitLog.instance.getCurrentPosition())); + memtableMetrics = memtableFactory.createMemtableMetrics(metadata); + } data = new Tracker(this, initialMemtable, loadSSTables); // Note that this needs to happen before we load the first sstables, or the global sstable tracker will not @@ -428,7 +432,7 @@ public ColumnFamilyStore(Keyspace keyspace, indexManager.addIndex(info, true); } - metric = new TableMetrics(this, memtableFactory.createMemtableMetrics(metadata)); + metric = new TableMetrics(this, memtableMetrics); if (data.loadsstables) { diff --git a/src/java/org/apache/cassandra/db/memtable/SkipListMemtable.java b/src/java/org/apache/cassandra/db/memtable/SkipListMemtable.java index b675e69e0f33..73ec70935374 100644 --- a/src/java/org/apache/cassandra/db/memtable/SkipListMemtable.java +++ b/src/java/org/apache/cassandra/db/memtable/SkipListMemtable.java @@ -67,7 +67,7 @@ public class SkipListMemtable extends AbstractAllocatorMemtable { private static final Logger logger = LoggerFactory.getLogger(SkipListMemtable.class); - public static final Factory FACTORY = SkipListMemtable::new; + public static final Factory FACTORY = SkipListMemtableFactory.INSTANCE; private static final int ROW_OVERHEAD_HEAP_SIZE; static diff --git a/src/java/org/apache/cassandra/db/memtable/DefaultMemtableFactory.java b/src/java/org/apache/cassandra/db/memtable/SkipListMemtableFactory.java similarity index 56% rename from src/java/org/apache/cassandra/db/memtable/DefaultMemtableFactory.java rename to src/java/org/apache/cassandra/db/memtable/SkipListMemtableFactory.java index 5bd28d0d9164..3158a92e3f96 100644 --- a/src/java/org/apache/cassandra/db/memtable/DefaultMemtableFactory.java +++ b/src/java/org/apache/cassandra/db/memtable/SkipListMemtableFactory.java @@ -25,44 +25,20 @@ import org.apache.cassandra.schema.TableMetadataRef; /** - * This class exists solely to avoid initialization of the default memtable class. - * Some tests want to setup table parameters before initializing DatabaseDescriptor -- this allows them to do so. + * This class makes better sense as an inner class to SkipListMemtable (which could be as simple as + * FACTORY = SkipListMemtable::new), but having it there causes the SkipListMemtable class to be initialized the first + * time it is referenced (e.g. during default memtable factory construction). + * + * Some tests want to setup table parameters before initializing DatabaseDescriptor -- this allows them to do so, and + * also makes sure the memtable memory pools are not created for offline tools. */ -public class DefaultMemtableFactory implements Memtable.Factory +public class SkipListMemtableFactory implements Memtable.Factory { @Override public Memtable create(AtomicReference commitLogLowerBound, TableMetadataRef metadaRef, Memtable.Owner owner) { - return SkipListMemtable.FACTORY.create(commitLogLowerBound, metadaRef, owner); - } - - @Override - public boolean writesShouldSkipCommitLog() - { - return SkipListMemtable.FACTORY.writesShouldSkipCommitLog(); - } - - @Override - public boolean writesAreDurable() - { - return SkipListMemtable.FACTORY.writesAreDurable(); - } - - @Override - public boolean streamToMemtable() - { - return SkipListMemtable.FACTORY.streamToMemtable(); - } - - @Override - public boolean streamFromMemtable() - { - return SkipListMemtable.FACTORY.streamFromMemtable(); + return new SkipListMemtable(commitLogLowerBound, metadaRef, owner); } - @Override - public TableMetrics.ReleasableMetric createMemtableMetrics(TableMetadataRef metadataRef) - { - return SkipListMemtable.FACTORY.createMemtableMetrics(metadataRef); - } + public static final SkipListMemtableFactory INSTANCE = new SkipListMemtableFactory(); } diff --git a/src/java/org/apache/cassandra/schema/MemtableParams.java b/src/java/org/apache/cassandra/schema/MemtableParams.java index f5ec4d7d0a96..4765e281972a 100644 --- a/src/java/org/apache/cassandra/schema/MemtableParams.java +++ b/src/java/org/apache/cassandra/schema/MemtableParams.java @@ -26,7 +26,7 @@ import com.google.common.collect.ImmutableMap; import org.apache.cassandra.config.DatabaseDescriptor; -import org.apache.cassandra.db.memtable.DefaultMemtableFactory; +import org.apache.cassandra.db.memtable.SkipListMemtableFactory; import org.apache.cassandra.db.memtable.Memtable; import org.apache.cassandra.exceptions.ConfigurationException; @@ -60,7 +60,7 @@ public String toString() private MemtableParams() { this.options = ImmutableMap.of(); - this.factory = new DefaultMemtableFactory(); + this.factory = SkipListMemtableFactory.INSTANCE; } public MemtableParams(Map options)